mavn jar包依賴沖突解決


背景:使用maven很方便,但是引入沖突也很常見。后果很嚴重,各種不明實體找不到,所以需要對jar包的依賴有一個清晰的認識。

查看沖突

參考:用dependency:tree查看maven引入jar包的傳遞依賴

maven 樹 查看依賴

查看jar包的傳遞依賴,最方便的方式就是打依賴樹,使用mvn dependency:tree -Dverbose

改命令在執行時候回重新build一次

dependency:tree -Dverbose

 使用如下命令查看單個jar包的依賴

#詳細查看jar包依賴
mvn dependency:tree -Dverbose -Dincludes=<groupId>:<artifactId>

mvn dependency:tree -Dverbose -Dincludes=:notify-common

 

輸出結果:

[INFO] +- org.apache.tomcat:tomcat-servlet-api:jar:7.0.70:compile
[INFO] +- org.apache.tomcat:tomcat-jsp-api:jar:7.0.70:compile
[INFO] |  +- org.apache.tomcat:tomcat-el-api:jar:7.0.70:compile
[INFO] |  \- (org.apache.tomcat:tomcat-servlet-api:jar:7.0.70:compile - omitted for duplicate)
[INFO] +- net.sf.jasperreports:jasperreports:jar:5.6.0:compile
[INFO] |  +- (commons-beanutils:commons-beanutils:jar:1.8.0:compile - omitted for conflict with 1.8.3)
[INFO] |  +- commons-collections:commons-collections:jar:3.2.1:compile
[INFO] |  +- commons-digester:commons-digester:jar:2.1:compile
[INFO] |  |  +- (commons-beanutils:commons-beanutils:jar:1.8.3:compile - omitted for duplicate)
[INFO] |  |  \- (commons-logging:commons-logging:jar:1.1.1:compile - omitted for duplicate)

 

遞歸依賴的關系列的算是比較清楚了,每行都是一個jar包,根據縮進可以看到依賴的關系。

  • 最后寫着compile的就是編譯成功的。
  • 最后寫着omitted for duplicate的就是有jar包被重復依賴了,但是jar包的版本是一樣的。
  • 最后寫着omitted for conflict with xxxx的,說明和別的jar包版本沖突了,而該行的jar包不會被引入。比如上面有一行最后寫着omitted for conflict with 1.8.3,那么該行的commons-beanutils:jar:1.8.0不會被引入,只有1.8.3版本的會被引入。

解決重復依賴和沖突的方法:

1,修改pom文件中兩個dependency元素的位置。如果兩個dependency都引用了一個jar包,但是版本不同,classloader只會加載jar包在pom文件中出現的第一個版本,以后出現的其他版本的jar包會被忽略。

不建議使用該方法,因為引用不同版本的jar包本身就是很危險的。

2,使用<exclusions>標簽來去掉某個dependency依賴中的某一個jar包或一堆jar包,<exclusion>中的jar包或者依賴的相關jar包都會被忽略,從而在兩個dependency都依賴某個jar包時,可以保證只使用其中的一個。

可以這么寫:

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>dubbo</artifactId>
    <version>2.8.3.2</version>
    <exclusions>
        <exclusion>
            <artifactId>guava</artifactId>
            <groupId>com.google.guava</groupId>
        </exclusion>
        <exclusion>
            <artifactId>spring</artifactId>
            <groupId>org.springframework</groupId>
        </exclusion>    
    </exclusions>
</dependency>

 

我們會遇到ClassNotFoundException,NoSuchFieldException,NoSuchMethodException 之類的運行時異常,從經驗上我們就會判斷,Jar包沖突了。解決Jar包沖突問題,每個人都有每個人的方法,這里我介紹一下我的方法,供大家參考。

問題解決

對於maven問題,一般解決方式是

1 查看依賴樹,解決沖突

2 編譯,缺什么jar包就添加什么jar包(親身體會)

 

最佳解決辦法:

idea安裝maven helper插件。如果出現jar包沖突,點擊工程的pom文件,選擇conflict,刷新,即可看到沖突的jar包。

這里有1.2 和1.9兩個沖突的版本,只需要將低版本exclude就可以了。easy

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM