在項目的開發(fā)中無法避免的遇到一些奇怪的問題尤其是Jar的管理方便更讓人惱火。
依賴傳遞的原則
幾乎所有的Jar包沖突都和依賴傳遞原則有關(guān)。下面說明Maven的依賴傳遞原則。
最短路徑優(yōu)先原則
假如引入了兩個Jar包A、B,都依賴Z這個Jar包
A -> Y -> X -> Z(2.5)
B -> X -> Z(2.0)
那么最終生效的是Z(2.0)版本
最先聲明優(yōu)先原則
如果路徑長短一樣,優(yōu)先選擇先聲明的那個
A -> Z(3.0)
B -> Z(3.5)
這里A最先聲明,所以依賴Z(3.0)
引起沖突的原因
假設(shè)我們項目中依賴了A和B兩個Jar包。而A和B各自又有以下傳遞依賴
A -> X -> Z(2.0)
B -> X -> Y -> Z(2.5)
那最終系統(tǒng)中Z包就產(chǎn)生了沖突,2.0和2.5兩個版本沖突。但是classpath中只會依賴一個版本的Z包。根據(jù)傳遞依賴的最短路徑優(yōu)先原則,最終依賴的應(yīng)該是2.0版本。
如果Y包中用了Z包2.5版本中新的method時候,當運行到這段邏輯的時候。就會報NoSuchMethodError了。因為本來依賴的是2.5版本,但是因為Jar包沖突Maven選擇了2.0版本,2.0版本中又沒有這個新的method,導致出錯。
但要注意的是,不是所有沖突都會引起運行異常。相反,大部分公司的項目都會有一些Jar包沖突,但其實沒有造成運行時的問題。
這是因為很多傳遞依賴的Jar包,不管是2.0版本也好,2.5版本也好,都可以運行。
當出現(xiàn)jar包沖突時,一般建議采用高版本的jar包,因為高版本的jar在設(shè)計時一般會考慮向下兼容。只有高版本Jar包不向下兼容才有可能導致這樣的問題。
定位沖突
使用插件MavenHelper。具體使用可以參考下方連接,以后使用到則補充。
解決沖突的幾個簡單技巧
依賴排除法
將沖突的依賴排除。<exclusions> 使用Maven工具也可以右鍵->Exclude

版本鎖定法
通過指定版本的方式打破2個依賴傳遞原則,優(yōu)先級最高。

Maven 加載Jar包的優(yōu)先級順序
項目子Module對應(yīng)的Jar包 > 本地倉庫Jar包 > 遠程倉庫的Jar包
————————————————
版權(quán)聲明:本文為CSDN博主「穿金頭戴帽」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/qq_41149775/article/details/127076733