Maven依賴(lài)沖突原因以及解決方法
什么是依賴(lài)沖突
依賴(lài)沖突是指項(xiàng)目依賴(lài)的某一個(gè) jar 包,有多個(gè)不同的版本,因而造成類(lèi)包版本沖突
依賴(lài)沖突的原因
依賴(lài)沖突很經(jīng)常是類(lèi)包之間的間接依賴(lài)引起的。每個(gè)顯式聲明的類(lèi)包都會(huì)依賴(lài)于一些其它的隱式類(lèi)包,這些隱式的類(lèi)包會(huì)被 maven 間接引入進(jìn)來(lái),從而造成類(lèi)包沖突
如何解決依賴(lài)沖突
首先查看產(chǎn)生依賴(lài)沖突的類(lèi) jar,其次找出我們不想要的依賴(lài)類(lèi) jar,手工將其排除在外就可以了。具體執(zhí)行步驟如下
1、查看依賴(lài)沖突
a、通過(guò) dependency:tree 是命令來(lái)檢查版本沖突
mvn -Dverbose dependency:tree
當(dāng)敲入上述命令時(shí),控制臺(tái)會(huì)出現(xiàn)形如下內(nèi)容
[INFO] org.example:hello:jar:1.0-SNAPSHOT [INFO] +- org.springframework:spring-context:jar:5.2.7.RELEASE:compile [INFO] | +- (org.springframework:spring-aop:jar:5.2.7.RELEASE:compile - omitted for conflict with 5.2.0.RELEASE) [INFO] | +- org.springframework:spring-beans:jar:5.2.7.RELEASE:compile [INFO] | | \- (org.springframework:spring-core:jar:5.2.7.RELEASE:compile - omitted for duplicate) [INFO] | +- org.springframework:spring-core:jar:5.2.7.RELEASE:compile [INFO] | | \- org.springframework:spring-jcl:jar:5.2.7.RELEASE:compile [INFO] | \- org.springframework:spring-expression:jar:5.2.7.RELEASE:compile [INFO] | \- (org.springframework:spring-core:jar:5.2.7.RELEASE:compile - omitted for duplicate) [INFO] \- org.springframework:spring-aop:jar:5.2.0.RELEASE:compile [INFO] +- (org.springframework:spring-beans:jar:5.2.0.RELEASE:compile - omitted for conflict with 5.2.7.RELEASE) [INFO] \- (org.springframework:spring-core:jar:5.2.0.RELEASE:compile - omitted for conflict with 5.2.7.RELEASE)
其中 omitted for duplicate 表示有 jar 包被重復(fù)依賴(lài),最后寫(xiě)著 omitted for conflict with xxx 的,說(shuō)明和別的 jar 包版本沖突了,而該行的 jar 包不會(huì)被引入。比如上面有一行最后寫(xiě)著 omitted for conflict with 5.2.7.RELEASE,表示 spring-core 5.2.0 版本不會(huì)被項(xiàng)目引用,而 spring-core 5.2.7 版本會(huì)被項(xiàng)目引用
b、如果是 idea,可以安裝 maven helper 插件來(lái)檢查依賴(lài)沖突
maven helper 插件安裝成功,點(diǎn)開(kāi) pom.xml 會(huì)發(fā)現(xiàn)多了一個(gè) Dependency Analyzer 視圖,如下

上面按鈕的圖標(biāo)含義如下
- Conflicts(查看沖突)
- All Dependencies as List(列表形式查看所有依賴(lài))
- All Dependencies as Tree(樹(shù)形式查看所有依賴(lài))
上圖說(shuō)明有 3 個(gè) jar 存在沖突,點(diǎn)擊沖突的 jar,可以查看和哪個(gè) jar 產(chǎn)生沖突,如下圖

2、解決沖突
項(xiàng)目的 pom.xml 形如下
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.7.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>5.2.0.RELEASE</version>
</dependency>
</dependencies>
通過(guò)查看依賴(lài)樹(shù),我們知道項(xiàng)目會(huì)引用 5.2.7.RELEASE 的 spring core jar 包,而不會(huì)引用 5.2.0 的 jar 包,如果我們想用 5.2.0 版本的 spring core 包,我們?cè)撊绾巫觯?/p>
a、使用第一聲明者優(yōu)先原則
誰(shuí)先定義的就用誰(shuí)的傳遞依賴(lài),即在 pom.xml 文件自上而下,先聲明的 jar 坐標(biāo),就先引用該 jar 的傳遞依賴(lài)。因此我們?nèi)绻褂?5.2.0 版本的 spring core 包,我們可以改成如下聲明
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>5.2.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.7.RELEASE</version>
</dependency>
</dependencies>
查看依賴(lài)樹(shù)
[INFO] org.example:hello:jar:1.0-SNAPSHOT [INFO] +- org.springframework:spring-aop:jar:5.2.0.RELEASE:compile [INFO] | +- org.springframework:spring-beans:jar:5.2.0.RELEASE:compile [INFO] | | \- (org.springframework:spring-core:jar:5.2.0.RELEASE:compile - omitted for duplicate) [INFO] | \- org.springframework:spring-core:jar:5.2.0.RELEASE:compile [INFO] | \- org.springframework:spring-jcl:jar:5.2.0.RELEASE:compile [INFO] \- org.springframework:spring-context:jar:5.2.7.RELEASE:compile [INFO] +- (org.springframework:spring-aop:jar:5.2.7.RELEASE:compile - omitted for conflict with 5.2.0.RELEASE) [INFO] +- (org.springframework:spring-beans:jar:5.2.7.RELEASE:compile - omitted for conflict with 5.2.0.RELEASE) [INFO] +- (org.springframework:spring-core:jar:5.2.7.RELEASE:compile - omitted for conflict with 5.2.0.RELEASE) [INFO] \- org.springframework:spring-expression:jar:5.2.7.RELEASE:compile [INFO] \- (org.springframework:spring-core:jar:5.2.7.RELEASE:compile - omitted for conflict with 5.2.0.RELEASE)
通過(guò)依賴(lài)樹(shù),我們可以看到項(xiàng)目已經(jīng)引入 5.2.0 版本的 spring core 包
b、使用路徑近者優(yōu)先原則
即直接依賴(lài)級(jí)別高于傳遞依賴(lài)。因此我們可以在最先的 pom.xml 添加如下內(nèi)容
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.7.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>5.2.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>5.2.0.RELEASE</version>
</dependency>
</dependencies>

通過(guò)上圖可以看到項(xiàng)目引入是 spring core 5.2.0 的包
c、排除依賴(lài)
排除依賴(lài)如果是 idea,可以使用 maven helper 插件進(jìn)行排除。點(diǎn)開(kāi) pom.xml,切換到 Dependency Analyzer 視圖,選擇 All Dependencies as Tree,點(diǎn)擊要排除的 jar,右鍵會(huì)出現(xiàn) Execlude 選項(xiàng),如下

它產(chǎn)生的效果和如下配置是一樣
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.7.RELEASE</version>
<exclusions>
<exclusion>
<artifactId>spring-core</artifactId>
<groupId>org.springframework</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>5.2.0.RELEASE</version>
</dependency>
</dependencies>

通過(guò)上圖可以看到項(xiàng)目引入是 spring core 5.2.0 的包
4、版本鎖定
使用 dependencyManagement 進(jìn)行版本鎖定,dependencyManagement 可以統(tǒng)一管理項(xiàng)目的版本號(hào),確保應(yīng)用的各個(gè)項(xiàng)目的依賴(lài)和版本一致。
如果我們項(xiàng)目中只想使用 spring core 5.2.0 的包,pom.xml 可以改為如下
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>5.2.0.RELEASE</version>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.7.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>5.2.0.RELEASE</version>
</dependency>
</dependencies>
通過(guò)上圖可以看到項(xiàng)目引入是 spring core 5.2.0 的包
總結(jié)
綜上就是 maven 如何排查依賴(lài)沖突以及解決方法,對(duì)于排查依賴(lài)個(gè)人比較推薦使用 maven helper 插件,至于解決依賴(lài)沖突個(gè)人推薦使用版本鎖定的方法,此外 dependencyManagement 只是聲明依賴(lài),并不自動(dòng)實(shí)現(xiàn)引入,因此子項(xiàng)目需要顯示的聲明需要用的依賴(lài)
以上就是Maven依賴(lài)沖突原因以及解決方法的詳細(xì)內(nèi)容,更多關(guān)于Maven依賴(lài)沖突的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- Maven依賴(lài)沖突的成因與解決方案
- Maven中依賴(lài)沖突的排查和修復(fù)全流程指南
- Maven?依賴(lài)沖突調(diào)解與版本控制問(wèn)題記錄
- maven解決依賴(lài)沖突的三種解決方法
- maven依賴(lài)沖突加載順序與解決
- Maven直接依賴(lài)、間接依賴(lài)、依賴(lài)沖突、依賴(lài)仲裁的實(shí)現(xiàn)
- Maven依賴(lài)沖突的幾種有效解決方法總結(jié)
- 解決Maven依賴(lài)沖突的方法
- maven依賴(lài)傳遞和依賴(lài)沖突原理
- 關(guān)于Maven依賴(lài)沖突解決之exclusions
- Maven 依賴(lài)原則和依賴(lài)沖突的使用小結(jié)
相關(guān)文章
詳解RabbitMQ中死信隊(duì)列和延遲隊(duì)列的使用詳解
這篇文章主要為大家介紹了RabbitMQ中死信隊(duì)列和延遲隊(duì)列的原理與使用,這也是Java后端面試中常見(jiàn)的問(wèn)題,感興趣的小伙伴可以了解一下2022-05-05
對(duì)SpringBoot項(xiàng)目配置文件進(jìn)行加密實(shí)現(xiàn)過(guò)程
文章介紹了如何在Spring Boot項(xiàng)目中使用Maven依賴(lài)和單元測(cè)試生成加密數(shù)據(jù),并將加密數(shù)據(jù)配置在`bootstrap.yml`或`application.yml`中,同時(shí),分享了如何在不同環(huán)境中配置加密鹽,包括IDE啟動(dòng)項(xiàng)、配置文件和Dockerfile2025-10-10
JDK數(shù)組阻塞隊(duì)列源碼深入分析總結(jié)
在這篇文章當(dāng)中,我們將通過(guò)源碼仔細(xì)為大家介紹一下JDK具體是如何實(shí)現(xiàn)數(shù)組阻塞隊(duì)列的,文中的示例代碼講解詳細(xì),感興趣的可以了解一下2022-08-08
java打包maven啟動(dòng)報(bào)錯(cuò)jar中沒(méi)有主清單屬性
本文主要介紹了java打包maven啟動(dòng)報(bào)錯(cuò)jar中沒(méi)有主清單屬性,可能原因是創(chuàng)建springboot項(xiàng)目時(shí),自動(dòng)導(dǎo)入,下面就來(lái)介紹一下解決方法,感興趣的可以了解一下2024-03-03
springboot集成Deepseek4j的項(xiàng)目實(shí)踐
本文主要介紹了springboot集成Deepseek4j的項(xiàng)目實(shí)踐,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2025-03-03
SpringBoot3整合SpringDoc OpenAPI生成接口文檔的詳細(xì)過(guò)程
SpringDoc OpenAPI 是一個(gè)強(qiáng)大的工具,能夠幫助我們輕松生成 OpenAPI 3.0 規(guī)范的文檔,并提供交互式的 Swagger UI 界面,所以本文給大家介紹了SpringBoot3整合SpringDoc OpenAPI生成接口文檔的詳細(xì)過(guò)程,需要的朋友可以參考下2024-07-07
Java多輸入框查詢(xún)需求實(shí)現(xiàn)方法詳解
這篇文章主要給大家介紹了Java多輸入框查詢(xún)需求實(shí)現(xiàn)的相關(guān)資料,文中通過(guò)代碼以及圖文介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Java具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-10-10
java編程SpringSecurity入門(mén)原理及應(yīng)用簡(jiǎn)介
Spring 是非常流行和成功的 Java 應(yīng)用開(kāi)發(fā)框架,Spring Security 正是 Spring 家族中的成員。Spring Security 基于 Spring 框架,提供了一套 Web 應(yīng)用安全性的完整解決方案2021-09-09

