java jar包衝突解決方法

jar包衝突幾乎是每一個Java程序員都會遇到的問題,並且特別是大工程,jar包各類依賴,常常性發生包衝突。一般會報這樣幾個運行時異常:java

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

這類問題十有八九都是jar包衝突引發,要解決jar包衝突問題,咱們先了解下致使這個衝突的緣由。程序員

致使jar包衝突的緣由

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

二、mvn的依賴仲裁規則:.net

    1). 按照項目總控POM的DependencyManager版本聲明進行仲裁。
    2). 如無仲裁聲明,則按照依賴最短路徑肯定版本。
    3). 若相同路徑,有嚴格區間限定的版本優先。
    4). 若相同路徑,無版本區間,則按照先入爲主原則。命令行

三、依賴的scope會影響依賴的影響範圍。開發


簡單衝突解決的三途徑!

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

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

    2).  引入了不一樣座標可是具備同名class的多個jar,mvn加載class的順序差別會致使加載到錯誤的class。io

二、經過mvn dependency:tree  >  tree.txt 導出所有的依賴。 可使用 -Dverbose 、-Dincludes或者-Dexcludes參數來精肯定位致使衝突的jar包。 編譯

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

4.舒適提示:另外在項目開發中jar儘可能按需引入,系統管理起來,別什麼都無論直接加包進來,這樣也能夠在必定程度上減小jar包衝突的風險。

 

 

 

在程序運行的時候究竟會有多少類被加載呢,一個簡單程序會加載上百個類的!你能夠用verbose:class來監視,在命令行輸入java -verbose:class XXX  (XXX爲程序名)你會在控制檯看到加載的類的狀況。

 verbose和verbose:class含義相同,輸出虛擬機裝入的類的信息,顯示的信息格式以下: [Loaded java.io.FilePermission$1 from shared objects file] 當虛擬機報告類找不到或類衝突時可用此參數來診斷來查看虛擬機從裝入類的狀況。

相關文章
相關標籤/搜索