maven依賴jar包時(shí)版本沖突的解決方案
1、第一聲明優(yōu)先原則
在pom.xml配置文件中,如果有兩個(gè)名稱相同版本不同的依賴聲明,那么先寫的會(huì)生效。
- 所以,先聲明自己要用的版本的jar包即可。
- 所以,添加新依賴時(shí)要放在最后邊,以防止新依賴替換原有依賴造成版本沖突。
2、路徑近者優(yōu)先
直接依賴優(yōu)先于傳遞依賴,如果傳遞依賴的jar包版本沖突了,那么可以自己聲明一個(gè)指定版本的依賴jar,即可解決沖突。
3、排出原則
傳遞依賴沖突時(shí),可以在不需要的jar的傳遞依賴中聲明排除,從而解決沖突。
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-spring-plugin</artifactId>
<version>2.3.24</version>
<exclusions>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
</exclusion>
</exclusions>
</dependency>4、版本鎖定原則(最常使用)
在配置文件pom.xml中先聲明要使用哪個(gè)版本的相應(yīng)jar包,聲明后其他版本的jar包一律不依賴。解決了依賴沖突。
<properties>
<spring.version>4.2.4.RELEASE</spring.version>
<hibernate.version>5.0.7.Final</hibernate.version>
<struts.version>2.3.24</struts.version>
</properties>
<!-- 鎖定版本,struts2-2.3.24、spring4.2.4、hibernate5.0.7 -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
</dependencies>
</dependencyManagement>5、查看jar包的間接依賴
如果發(fā)現(xiàn)某個(gè)jar包,自己的pom中并沒有定義,想看一下是被哪個(gè)jar包間接引用的,執(zhí)行以下命令,直接輸出到當(dāng)前項(xiàng)目下,然后在idea中打開,搜索要找的jar包名字即可。
這里的 “±” 和"-"并沒有什么意義,只是為了讓分級(jí)看起來更直觀。
mvn dependency:tree mvn dependency:tree>temp

如果想看沖突和重復(fù)的具體情況,用verbose參數(shù)
mvn dependency:tree -Dverbose -Dincludes=[commons-collections]

因此,我們可以看到Commons Collections 2.0被選為2.1,因?yàn)樗x它更近,并且默認(rèn)情況下,Maven使用最近贏得策略解決版本沖突。
6、排包

如圖可知jai_core是在icepdf-core被間接引用的,如果jai_core的間接引入造成了依賴沖突,可在icepdf-core使用如下方式排出
<dependency>
<groupId>org.icepdf.os</groupId>
<artifactId>icepdf-core</artifactId>
<version>6.2.2</version>
<exclusions>
<exclusion>
<groupId>javax.media</groupId>
<artifactId>jai_core</artifactId>
</exclusion>
</exclusions>
</dependency>7、處理jar包依賴沖突總結(jié)
簡介:處理jar包依賴沖突,首先,對于多個(gè)jar包都引用同一jar包的情況,最好是在程序中顯式定義被共同引用的jar包的依賴,來統(tǒng)一版本號(hào),方便維護(hù)
如果A和B都依賴同一jar包C,可能會(huì)出現(xiàn)兩種情況
A和B引用的C版本相同,這時(shí)按照pom定義順序選擇第一個(gè)即可,沒有沖突問題,如果在項(xiàng)目的maven中顯示定義了C依賴,那么用選擇項(xiàng)目定義的依賴,反正version都一樣,沒有影響
A和B依賴的C版本不同,選擇版本高的那個(gè),這時(shí)會(huì)出現(xiàn)兩種結(jié)果
(1) 高版本兼容低版本,所以不會(huì)出現(xiàn)問題(2)高版本不兼容低版本,假如A依賴C2版本,B依賴C3版本,C3不兼容C2,maven選擇了高版本C3,對A來說會(huì)出現(xiàn)問題?
有3種解決方法[1] [2]如果B版本也可依賴C2,在項(xiàng)目的maven中顯示定義對C2的依賴,這樣所有都使用C2版本[3]如果B版本不支持C2版本,只能降低B版本,找到依賴C2的B版本從功能性和可維護(hù)性考慮,高版本提供的功能更多,bug更少,優(yōu)先考慮1再考慮2最后考慮3
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Spring-Cloud-Function-Spel?漏洞環(huán)境搭建
這篇文章主要介紹了Spring-Cloud-Function-Spel?漏洞復(fù)現(xiàn)及搭建方法,搭建方法也很簡單,首先需要安裝maven jdk,具體安裝過程跟隨小編一起看看吧2022-03-03
MyBatis綁定錯(cuò)誤提示BindingException:Invalid bound statement (not f
這篇文章主要介紹了MyBatis綁定錯(cuò)誤提示BindingException:Invalid bound statement (not found)的解決辦法,非常不錯(cuò),具有參考借鑒價(jià)值,需要的的朋友參考下吧2017-01-01
SpringBoot實(shí)現(xiàn)微信小程序支付功能
小程序支付功能已成為眾多應(yīng)用的核心需求之一,本文主要介紹了SpringBoot實(shí)現(xiàn)微信小程序支付功能,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2025-04-04
關(guān)于Java中阻塞隊(duì)列BlockingQueue的詳解
這篇文章主要介紹了關(guān)于Java中阻塞隊(duì)列BlockingQueue的詳解,BlockingQueue是為了解決多線程中數(shù)據(jù)高效安全傳輸而提出的,從阻塞這個(gè)詞可以看出,在某些情況下對阻塞隊(duì)列的訪問可能會(huì)造成阻塞,需要的朋友可以參考下2023-05-05
解決httpServletRequest.getParameter獲取不到參數(shù)的問題
這篇文章主要介紹了解決httpServletRequest.getParameter獲取不到參數(shù)的問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07

