maven打包時的三方包的選擇順序


在一個項目有多個模塊引用多個版本的某個插件(或者叫三方包、jar包等)時,如何解決版本沖突問題?最終選用某個版本還是選擇幾個版本?

maven在遇到上面的情況時,會智能處理版本沖突,最終選擇一個版本,選取的原則是:

1、就近原則:根據依賴路徑最短選擇版本

2、路徑相同選擇最先出現的,及第一聲明原則

 

那么問題來了,當有多個模塊引用同一個版本時,如何查看依賴路徑?如果路徑長度相同,哪個最先出現?

首先在根pom或者父pom中引入maven-dependency-plugin這個插件,在項目的根目錄執行命令mvn dependency:tree可以查看jar包的依賴順序,如圖,可以清楚的查看某個jar的依賴路徑;

使用命令mvn dependency:tree -Dverbose可以查看查看更詳細的信息,主要是告訴你那些版本因為沖突而被忽略

 

 使用mvn dependency:list,可以列出依賴的所有jar包

執行錯誤的命令,可以查看這個插件的所有命令:項目中,我常用mvn dependency:copy-dependencies -DoutputDirectory=~/dependencies命令把項目的所有依賴拷貝到一個目錄里。

但是這個方法存在一個問題:就是它只解決模塊內部的版本沖突,並沒有解決項目各個模塊之間的依賴沖突,因此有的時候會存在多個jar包的現象,以至於你也說不清用戶最終使用的是哪個版本的jar包,也就無法明確判斷用戶使用的jar包到底違不違反部門確定的“必須使用某個jar包的規定”

聯想:pip install pyquery==2.2.222222一個錯誤的版本號,通過錯誤信息,你可以看到所有支持的正確的版本,這樣再選擇一個正確的版本

 

為了解決mvn dependenc:copy-dependencies上面存在的多個版本的問題,一個比較笨拙的解決辦法是:使用mvn depedency:tree > tree.txt 把依賴及依賴路徑信息拷貝到某個目錄,然后使用py腳本把這些目錄的內容存入數據庫,當遇到多個版本的情況時,把這些tree.txt里的內容再拿出來,進行分析:

分析方法就是,對tree.txt進行每行匹配,找到某個插件出現在路徑里的順序以及版本號信息,找到那個maven最終使用的版本

如圖,通過查看版本名字和‘[INFO]’之間字符的個數來確定路徑,1個字符是路徑值是1,4個字符路徑值是2,依次類推。

 

還有另外一個方法:就是找到項目最終部署的目錄,已經目錄下的pom.xml文件,然后對這個目錄進行mvn dependency:copy-dependencies -DoutputDirectory=~/dependencies,這樣就可以得到項目最終的依賴列表。比如下面的項目目錄下的web目錄就是項目最終打包的配置

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM