1. 程式人生 > >Maven之jar包衝突解決

Maven之jar包衝突解決

用了Maven之後,不得不說它是一個很好的用於專案構建,管理,jar包管理的工具,但是使用過程中,相信各位也遇到過jar衝突這種煩人的問題,特別是大專案,依賴的jar包比較多,很容易造成jar包衝突,jar包衝突的一個很大的原因即產類包之間的間接依賴引起的。每個顯式宣告的類包都會依賴於一些其它的隱式類包,這些隱式的類包會被maven間接引入進來,因而可能造成一個我們不想要的類包的載入,由此導致jar包衝突。

要解決這個問題,首先就是要檢視pom.xml顯式和隱式的依賴類包,然後通過這個類包樹找出我們不想要的依賴類包,手工將其排除在外就可以了。 

jar包衝突幾乎是每個Java程式設計師都會遇到的問題,而且特別是大工程,jar包各種依賴,經常性發生包衝突。通常會報這樣幾個執行時異常:

  • java.lang.NoSuchMehodError
  • java.lang.NoClassDefFoundError

這類問題十有八九都是jar包衝突引起,要解決jar包衝突問題,我們先了解下導致這個衝突的原因。

導致jar包衝突的原因

1、mvn的傳遞依賴特性:mvn編譯打包除了會引入直接申明的依賴,還會引入間接申明的依賴

2、mvn的依賴仲裁規則:

    1). 按照專案總控POM的DependencyManager版本宣告進行仲裁。

    2). 如無仲裁宣告,則按照依賴最短路徑確定版本。

    3). 若相同路徑,有嚴格區間限定的版本優先。

    4). 若相同路徑,無版本區間,則按照先入為主原則。

3、依賴的scope會影響依賴的影響範圍。

簡單衝突解決的三途徑!

1、根據報錯的class名或方法名定位到可能導致衝突的jar包,jar包衝突引入有幾種情況:

    1).  引入了這個jar包的多個版本,而mvn仲裁的時候取了錯誤的版本,這個版本本身就缺少正確的class或方法。

    2).  引入了不同座標但是具有同名class的多個jar,mvn載入class的順序差異會導致載入到錯誤的class。

2、通過mvn dependency:tree  >  tree.txt 匯出全部的依賴。 可以使用 -Dverbose 、-Dincludes或者-Dexcludes參

數來精確定位導致衝突的jar包。 

3、找到需要排除的依賴jar包,通過mvn仲裁優先的方法定義正確的jar包,或者通過exclusion的方式排除錯誤的jar包。

4.溫馨提示:另外在專案開發中jar儘量按需引入,系統管理起來,別什麼都不管直接加包進來,這樣也可以在一定程度上減少jar

包衝突的風險。

推薦大家一個Java的學習網站:Java知識學習網,Java資料下載,Java學習路線圖,網址:https://www.java1010.com