Jar包沖突解決方法
前言
對於Jar包沖突問題,我們開發人員經常都會有碰到,當我們使用一些jar包中的類、方法等,或者有時遇到一些日誌系統的問題(參考另一篇文章Jar包沖突導致的日誌問題),我們會遇到ClassNotFoundException,NoSuchFieldException,NoSuchMethodException 之類的運行時異常,從經驗上我們就會判斷,Jar包沖突了。解決Jar包沖突問題,每個人都有每個人的方法,這裏我介紹一下我的方法,供大家參考。
處理方法
當遇到jar包沖突時,我們首先確定是哪個jar包沖突了,這個很容易,看我們調用的類或方法,是屬於哪個Jar包。然後就是要找出沖突了,我這裏使用命令
mvn dependency:tree -Dverbose -Dincludes=<groupId>:<artifactId>
填寫上Jar包的groupId和artifactId,可以只有一個,但是中間的冒號不要少,這樣就會輸出依賴樹,而且是僅包含這個Jar包的依賴樹,這樣那些地方依賴了這個Jar包的那個版本就一目了然了。
例如,我的項目中notify-common包存在沖突,我們使用命令
mvn dependency:tree -Dverbose -Dincludes=:notify-common
得到依賴樹輸出
[INFO] com.taobao.wlb:bis-server:war:1.0-SNAPSHOT
[INFO] +- com.taobao.wlb:bis-core:jar:1.0-SNAPSHOT:compile
[INFO] | \- com.taobao.logistics:schedule-client:jar:1.1.1:compile
[INFO] | \- (com.taobao.notify:notify-common:jar:1.8.15:compile - omitted for conflict with 1.8.19.26)
[INFO] \- com.taobao.notify:notify-tr-client:jar:1.8.19.26:compile
[INFO] +- com.taobao.notify:notify-common:jar:1.8.19.26:compile
[INFO] \- com.taobao.notify:notify-remoting:jar:1.8.19.26:compile
[INFO] \- (com.taobao.notify:notify-common:jar:1.8.19.26:compile - omitted for duplicate)
看一下依賴樹中所有的葉子節點就是所有的notify-common包,我們可以看到我們依賴的bis-core中依賴了schedule-client包,它依賴了一個notify-common包,版本是1.8.15,第四行的後面也提示了這個包同其他包有沖突- omitted for conflict with 1.8.19.26)
。而我們的系統依賴的notify-tr-client包所依賴的版本是1.8.19.26,於是我們知道是這裏沖突了,在POM排除掉依賴,OK了。
說明
這裏我們對我們執行的命令做一個簡單的說明。mvn dependency:tree -Dverbose -Dincludes=<groupId>:<artifactId>
第一部分
mvn dependency:tree
是maven依賴的分析命令,作用是對我們的項目的依賴進行分析,並輸出項目依賴樹第二部分
-Dverbose
的作用是添加了verbose一個環境變量,起的作用是在分析項目依賴時輸出明細,這樣項目中依賴的所有引用都會被輸出出來,包含了所有的間接引用,會有很多很多,我們只需要我們要找的,所以就需要第三個參數了
第三部分-Dincludes=<groupId>:<artifactId>
的作用就是進行過濾,只包含我們想要的依賴的依賴時,排除掉其它不需要的,依賴樹的所有葉子節點就是我們的找的依賴包。其中的groupId和artifactId可以只填寫一個,為了保證準確性,一般都會填兩個(填寫時不包括尖括號)。
其他方法:
1、對於maven工程,我的辦法是使用eclipse來解決,點開pom.xml,切換到hierarchy dependency,右上角搜索對應的包,可以清晰地看到沖突版本
2、可以使用idea,在pom.xml中右單擊 選擇Diagrams-》show dependencies
3、mvn dependency:tree -Dverbose > tree.log
直接輸出沖突的jar文件
Jar包沖突解決方法