解決Maven重復依賴問題(同一個jar,多個版本)


問題描述

現在開發項目,一般都會創建maven工程,用它來管理依賴實在是方便了,當然它還有其它用途。但是在實際的情況中往往會有重復依賴的問題,比如創建的工程A,依賴了b-1.0.jar,而b-1.0.jar又依賴了d-1.0.jar(這個我們本身是不能直接看到的),同時我們自己的工程又依賴了d-2.1.jar,或者工程A依賴了c-1.0.jar,c-1.0.jar依賴了d-2.0.jar,顯然,d.jar有3個版本,3者之間是重復的,甚至是沖突的。如下圖所示:

在這里插入圖片描述

重復依賴會怎么樣?

首先從工程角度來講,引用了同一個Jar的不同版本,這肯定是依賴有問題,或者就是錯誤的。
其次,重復依賴,在項目啟動過程當中可能會有一些警告信息。
當然,最重要的是引發代碼異常,最常見的就是NoSuchMethod。

解決思路

  1. 尋找重復引用的jar。
  2. 定位這些Jar在哪里被引用了。
  3. 接下來需要分析舍與留,原則上保留高版本,大多數情況下是向下兼容的。但是不一定,有時候也得保留低版本,或者有時候兩者都需要保留。
  4. 如果是一個工程,其實處理起來還比較好處理。但是如果有多個工程,最終我們可能將所有的依賴合在一塊兒。處理起來可能會稍微麻煩些,比如工程1依賴了2.1版本,工程2依賴了2.2版本,你把工程1的2.1的依賴去掉,但同時還需要把2.2的加在工程1上面,否則可能編譯不通過。
  5. 最重要的就是,調整之后,盡可能做全面測試。特別是一些間接依賴,如果去除的話,編譯不會有問題,但運行起來會有問題。

具體解決過程

上述5個步驟,重點說一下1和2.

尋找重復引用的jar

  1. 觀察法:把所有的jar依賴打包到同一個目錄下,觀察。
  2. 運行法:運行階段會報錯,一旦報錯,基本上就定位到了。
  3. 掃描法:專業的測試人員,可以進行掃描jar包並統計。
  4. 搜索法:依靠maven進行搜索,這個方法在接下來會講到。

定位Jar被依賴的地方

在maven工程處打開命令行,輸入:

mvn dependency:tree -Dverbose > tree.txt

這個命令會把這個工程pom.xml里面所有的依賴通過樹的形狀展示出來,tree.txt:

 

 

樹形結構其實看得比較清楚,里面有一些關鍵信息,比如:

omitted for duplicate

這個意思是依賴是重復的,當然這個沒有關系。

當然還有一些沖突提醒,上圖沒有,如下:

omitted for conflict with 0.5.3

顯示就是這個版本與0.5.3這個版本沖突了,這個也是我上面說到的搜索法,你可以直接搜索“conflict”這個單詞,就可以了。當然這種方式僅限單個工程。

拿到這棵樹以后,怎么辦呢?

前提是我們已經知道了哪個jar包沖突了,那直接就在文本里面搜索,找到不同版本的引用之處,然后慎重考慮之后,通過exclusions標簽進行去除,如下:

<dependency>
            <groupId>jaxen</groupId>
            <artifactId>jaxen</artifactId>
            <version>1.1.1</version>
            <exclusions>
                <exclusion>
                    <groupId>xerces</groupId>
                    <artifactId>xercesImpl</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

到此結束。去除的同時需要考慮的一些問題,在解決思路里面提及了一些。

 

版權聲明:本文來源CSDN,感謝博主原創文章,遵循 CC 4.0 by-sa 版權協議,轉載請附上原文出處鏈接和本聲明。
原文鏈接:https://blog.csdn.net/ywg_1994/article/details/88736790
站方申明:本站部分內容來自社區用戶分享,若涉及侵權,請聯系站方刪除。

 


免責聲明!

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



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