引入的Jar 沖突問題

在項目的開發(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。具體使用可以參考下方連接,以后使用到則補充。

MavenHelper
https://blog.csdn.net/qq_41149775/article/details/127076930?csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22127076930%22%2C%22source%22%3A%22qq_41149775%22%7D

解決沖突的幾個簡單技巧

依賴排除法

將沖突的依賴排除。<exclusions> 使用Maven工具也可以右鍵->Exclude

image.png
版本鎖定法

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


image.png
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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容