新聞中心
在實(shí)際開發(fā)中,多模塊項(xiàng)目常會使用Maven進(jìn)行包管理。在poml文件中進(jìn)行包依賴時,常存在引入一個jar包中默認(rèn)依賴了其他的jar包的情況。這樣很容易導(dǎo)致jar包沖突,從而產(chǎn)生一些詭異問題,如版本問題導(dǎo)致的類、方法找不到等。下面我們將聊聊具體關(guān)于依賴沖突產(chǎn)生的原因、排查方式以及解決的方案。

創(chuàng)新互聯(lián)是專業(yè)的修水網(wǎng)站建設(shè)公司,修水接單;提供成都做網(wǎng)站、網(wǎng)站設(shè)計(jì),網(wǎng)頁設(shè)計(jì),網(wǎng)站設(shè)計(jì),建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行修水網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴(kuò)展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團(tuán)隊(duì),希望更多企業(yè)前來合作!
依賴傳遞的概念
舉個簡單例子,比如一個多模塊項(xiàng)目依賴關(guān)系如下圖。其中bepe-dal引入了common-lib,當(dāng)bepe-manager模塊中引入bepe-dal時,common-lib這個依賴也會被引入到bepe-manager模塊中,這個就是依賴傳遞。
依賴沖突的概念
依賴沖突指當(dāng)模塊中引入很多jar包時,如果其中存在著groupId和artifactId 一樣,但是version不一樣的兩個jar包,這就是依賴沖突。那么在應(yīng)用時會選用哪一個version呢?這就是我們接下來要討論的沖突解決方式。
依賴沖突該是怎么解決的?
- 最短路徑原則
- 聲明優(yōu)先原則
- 依賴排除
1. 最短路徑原則
當(dāng)存在groupId和artifactId一致但是version不一致的jar包沖突時,模塊會自動選擇距離自己路徑短的包。如:bepe-manager到common-lib(1.0)的距離為2,bepe-manager到common-lib(2.0)的距離為1,就會選擇距離短的common-lib(2.0),這就是最短路徑原則。
2. 聲明優(yōu)先原則
當(dāng)沖突包路徑距離長度一樣時,這個時候就會依據(jù)其在pom文件中聲明的先后順序。
在manager模塊pom.xml中,如果先引用bepe-common,就會用2.0版本的common-lib。
com.company.bepe bepe-common 2.2 om.company.bepe bepe-dal 2.2
3. 依賴排除
通過 標(biāo)簽將不需要依賴的包進(jìn)行排除,通過這種方式我們就靈活進(jìn)行取舍。但是該如何發(fā)現(xiàn)沖突呢?接下來將討論關(guān)于依賴沖突排查的方式。
依賴沖突情況該怎么排查?
我們可以借助一些插件工具幫助找出沖突jar的具體位置。下面分享一下我在項(xiàng)目中排查并解決包沖突的兩種方式。
- maven-enforcer-plugin 插件
- Maven Helper 插件
1. maven-enforcer-plugin插件
Maven提供了Maven-Enforcer-Plugin插件 , 用來校驗(yàn)約定遵守情況,比依賴 jar 包的版本等等。當(dāng)規(guī)則檢查不通過的時候則會構(gòu)建失敗。
(1) 在pom.xml中引入該插件
rules內(nèi)則是定義校驗(yàn)規(guī)則,通過配置 可實(shí)現(xiàn)重復(fù)依賴檢測。也支持自定義做一些其他檢驗(yàn)如版本檢驗(yàn)等。關(guān)于maven-enforcer-plugin插件rules的其他配置用法,感興趣的朋友們,可以去查閱其相關(guān)的資料。
3.0.4 6.0 true junit:junit must use TestNG
(2) 配置好插件后進(jìn)行項(xiàng)目構(gòu)建,當(dāng)存在包沖突時會在console中打印出來。
(3) 依據(jù)信息便可將不需要的jar包通過 排除掉。
2. Maven Helper
使用IntelliJ IDE的Maven helper插件方便找到和排除沖突的依賴項(xiàng)
(1) command+, 打開工具的設(shè)置窗口
(2) 設(shè)置搜索中輸入plugin
(3) 在Marketplace table頁面中搜索Maven Helper,并安裝
(4) 重啟后即可使用,打開pom文件后,文件下面會多出Dependency Analyzer這一個tab,進(jìn)入Dependency Analyzer視圖之后有三個查看選項(xiàng),分別是Conflicts(沖突)、All Dependencies as List(列表形式查看所有依賴)、All Dependencies as Tree(樹結(jié)構(gòu)查看所有依賴)。通過查看信息后再做出對應(yīng)的依賴沖突處理。
總結(jié)
關(guān)于依賴沖突解決方式有三種:最短路徑原則、聲明優(yōu)先原則、依賴排除。在沒有手動進(jìn)行依賴排除的情況下,會依據(jù)最短路徑原則、聲明優(yōu)先原則來選擇jar包。關(guān)于依賴沖突排查可借助如maven-enforcer-plugin 與Maven Helper 插件。根據(jù)實(shí)際情況及環(huán)境,選擇組合最優(yōu)的解決方案解決依賴沖突問題。
分享題目:Maven中jar包沖突原理及解決的方式
分享鏈接:http://m.fisionsoft.com.cn/article/dhiodco.html


咨詢
建站咨詢
