1. 程式人生 > >Jar包衝突解決方法

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檔案