項目中,常常會遇到ClassNotFound,NoSuchMethod異常,第一反應每每是類路徑不對,jar沒有正確的引用。第一步判斷jar是否加載,仍是 加載的jar因爲maven依賴管理存在傳遞依賴,形成依賴的jar版本號不對,相應的類找不到,或者是相應類版本不對,沒有對應的方法。java
一 形成jar 衝突的緣由:若是項目中存在對同一jar不一樣版本依賴的時候,maven 2根據最近原則,默認引用最靠近項目版本的jar,maven 2.0.9會根據最早聲明原則 來引用相應版本的jar;不管那種方式,都會出現jar包衝突。在這裏提一下gradle依賴,會依賴最新版本的jar。web
二 判斷jar是否正確的被引用 有兩種方法:apache
1在項目啓動時加上VM參數:-verbose:classmaven
項目啓動的時候會把全部加載的jar都打印出來 相似以下的信息:ide
classpath加載的jar工具
-classpath /home/yao/tool/jdk1.8.0_25/jre/lib/jce.jar: /home/yao/tool/jdk1.8.0_25/jre/lib/resources.jar: /home/yao/tool/jdk1.8.0_25/jre/lib/rt.jar: /home/yao/tool/jdk1.8.0_25/jre/lib/management-agent.jar: /home/yao/tool/jdk1.8.0_25/jre/lib/jfxswt.jar: /home/yao/tool/jdk1.8.0_25/jre/lib/plugin.jar: /home/yao/tool/jdk1.8.0_25/jre/lib/javaws.jar: /home/yao/tool/jdk1.8.0_25/jre/lib/charsets.jar: /home/yao/tool/jdk1.8.0_25/jre/lib/jsse.jar: /home/yao/tool/jdk1.8.0_25/jre/lib/deploy.jar: /home/yao/tool/jdk1.8.0_25/jre/lib/jfr.jar: /home/yao/tool/jdk1.8.0_25/jre/lib/ext/localedata.jar: /home/yao/tool/jdk1.8.0_25/jre/lib/ext/nashorn.jar: /home/yao/tool/jdk1.8.0_25/jre/lib/ext/jfxrt.jar: /home/yao/tool/jdk1.8.0_25/jre/lib/ext/sunjce_provider.jar: ...............等等
具體load的類gradle
[Loaded java.lang.Object from /home/yao/tool/jdk1.8.0_25/jre/lib/rt.jar] [Loaded java.io.Serializable from /home/yao/tool/jdk1.8.0_25/jre/lib/rt.jar] [Loaded java.lang.Comparable from /home/yao/tool/jdk1.8.0_25/jre/lib/rt.jar] [Loaded java.lang.CharSequence from /home/yao/tool/jdk1.8.0_25/jre/lib/rt.jar] [Loaded java.lang.String from /home/yao/tool/jdk1.8.0_25/jre/lib/rt.jar] [Loaded java.lang.reflect.AnnotatedElement from /home/yao/tool/jdk1.8.0_25/jre/lib/rt.jar] [Loaded java.lang.reflect.GenericDeclaration from /home/yao/tool/jdk1.8.0_25/jre/lib/rt.jar] [Loaded java.lang.reflect.Type from /home/yao/tool/jdk1.8.0_25/jre/lib/rt.jar] [Loaded java.lang.Class from /home/yao/tool/jdk1.8.0_25/jre/lib/rt.jar] ..................等等
咱們能夠經過上面的信息查找對應的jar是否正確的被依賴,具體類加載狀況,同時能夠看到版本號,肯定是否因爲依賴衝突形成的jar引用不正確;spa
2 經過maven自帶的工具:mvn dependency:treecode
具體後面能夠加 -Dverbose 參數 ,詳細參數能夠去本身搜,這裏不詳細介紹。xml
好比分析以下POM
運行: mvn dependency:tree -Dverbose
<dependencies> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>3.2-FINAL</version> </dependency> <dependency> <groupId>commons-beanutils</groupId> <artifactId>commons-beanutils</artifactId> <version>1.7.0</version> </dependency> </dependencies>
輸出結果:
[INFO] ------------------------------------------------------------------------ [INFO] [INFO] --- maven-dependency-plugin:2.8:tree (default-cli) @ Dependency --- [INFO] com.yao:Dependency:pom:1.0-SNAPSHOT [INFO] +- org.apache.poi:poi:jar:3.2-FINAL:compile [INFO] | +- commons-logging:commons-logging:jar:1.1:compile [INFO] | | \- log4j:log4j:jar:1.2.13:compile [INFO] | \- (log4j:log4j:jar:1.2.13:compile - scope updated from runtime; omitted for duplicate) [INFO] \- commons-beanutils:commons-beanutils:jar:1.7.0:compile [INFO] \- (commons-logging:commons-logging:jar:1.0.3:compile - omitted for conflict with 1.1) [INFO] ------------------------------------------------------------------------
經過裏面的信息能夠看到 兩個jar都commons-logging存在依賴,可是版本不一樣。裏面的詳細信息顯示引用了 commons-logging:commons-logging:jar:1.1 去掉了commons-logging:commons-logging:jar:1.0.3 (omitted for duplicate)。
經過以上方法咱們能夠看到項目中引用jar版本號;接下來就是如何排除掉咱們不想要版本的jar;
三 經過Idea intellij 中的Show Dependencies的工具去除重複的jar
在Pom.xml文件上右擊 選擇 Diagrams -> Show Dependencies 便可查看Pom的依賴圖,經過圖能夠很容易的看到依賴衝突的jar,exculude掉不想要的版本jar便可。