maven依赖的jar包版本不一样_Maven依赖jar包冲突常见的解决方法
項目中,經常會遇到ClassNotFound,NoSuchMethod異常,第一反應往往是類路徑不對,jar沒有正確的引用。第一步判斷jar是否加載,還是 加載的jar由于maven依賴管理存在傳遞依賴,造成依賴的jar版本號不對,相應的類找不到,或者是相應類版本不對,沒有對應的方法。
一 造成jar 沖突的原因:如果項目中存在對同一jar不同版本依賴的時候,maven 2根據最近原則,默認引用最靠近項目版本的jar,maven 2.0.9會根據最先聲明原則 來引用相應版本的jar;無論那種方式,都會出現jar包沖突。在這里提一下gradle依賴,會依賴最新版本的jar。
二 判斷jar是否正確的被引用 有兩種方法:
1在項目啟動時加上VM參數:-verbose:class
項目啟動的時候會把所有加載的jar都打印出來 類似如下的信息:
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的類
[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引用不正確;
2 通過maven自帶的工具:??mvn dependency:tree
具體后面可以加 -Dverbose 參數 ,詳細參數可以去自己搜,這里不詳細介紹。
比如分析如下POM
運行: mvn dependency:tree -Dverbose
org.apache.poi
poi
3.2-FINAL
commons-beanutils
commons-beanutils
1.7.0
輸出結果:
[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即可。
總結
以上是生活随笔為你收集整理的maven依赖的jar包版本不一样_Maven依赖jar包冲突常见的解决方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ZZULIOJ 1104: 求因子和(函
- 下一篇: java获取linux下面所有线程,获取