網(wǎng)站首頁 編程語言 正文
什么是依賴沖突
依賴沖突是指項目依賴的某一個jar包,有多個不同的版本,因而造成類包版本沖突
依賴沖突的原因
依賴沖突很經(jīng)常是類包之間的間接依賴引起的。每個顯式聲明的類包都會依賴于一些其它的隱式類包,這些隱式的類包會被maven間接引入進來,從而造成類包沖突
如何解決依賴沖突
首先查看產(chǎn)生依賴沖突的類jar,其次找出我們不想要的依賴類jar,手工將其排除在外就可以了。具體執(zhí)行步驟如下
1、查看依賴沖突
a、通過dependency:tree是命令來檢查版本沖突
mvn -Dverbose dependency:tree
1
當敲入上述命令時,控制臺會出現(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)
123456789101112
其中omitted for duplicate表示有jar包被重復(fù)依賴,最后寫著omitted for conflict with xxx的,說明和別的jar包版本沖突了,而該行的jar包不會被引入。比如上面有一行最后寫著omitted for conflict with 5.2.7.RELEASE,表示spring-core 5.2.0版本不會被項目引用,而spring-core 5.2.7版本會被項目引用
b、如果是idea,可以安裝maven helper插件來檢查依賴沖突
maven helper插件安裝成功,點開pom.xml會發(fā)現(xiàn)多了一個Dependency Analyzer視圖,如下
上面按鈕的圖標含義如下
- Conflicts(查看沖突)
- All Dependencies as List(列表形式查看所有依賴)
- All Dependencies as Tree(樹形式查看所有依賴)
上圖說明有3個jar存在沖突,點擊沖突的jar,可以查看和哪個jar產(chǎn)生沖突,如下圖
2、解決沖突
項目的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>
12345678910111213141516
通過查看依賴樹,我們知道項目會引用5.2.7.RELEASE的spring core jar包,而不會引用5.2.0的jar包,如果我們想用5.2.0版本的spring core包,我們該如何做?
a、使用第一聲明者優(yōu)先原則
誰先定義的就用誰的傳遞依賴,即在pom.xml文件自上而下,先聲明的jar坐標,就先引用該jar的傳遞依賴。因此我們?nèi)绻褂?.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>
123456789101112131415
查看依賴樹
[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)
12345678910111213
通過依賴樹,我們可以看到項目已經(jīng)引入5.2.0版本的spring core包
b、使用路徑近者優(yōu)先原則
即直接依賴級別高于傳遞依賴。因此我們可以在最先的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>
12345678910111213141516171819202122
通過上圖可以看到項目引入是 spring core 5.2.0的包
c、排除依賴
排除依賴如果是idea,可以使用maven helper插件進行排除。點開pom.xml,切換到Dependency Analyzer視圖,選擇All Dependencies as Tree,點擊要排除的jar,右鍵會出現(xiàn)Execlude選項,如下
它產(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>
123456789101112131415161718192021
通過上圖可以看到項目引入是 spring core 5.2.0的包
4、版本鎖定
使用dependencyManagement 進行版本鎖定,dependencyManagement可以統(tǒng)一管理項目的版本號,確保應(yī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>
12345678910111213141516171819202122232425
通過上圖可以看到項目引入是 spring core 5.2.0的包
總結(jié)
綜上就是maven如何排查依賴沖突以及解決方法,對于排查依賴個人比較推薦使用maven helper插件,至于解決依賴沖突個人推薦使用版本鎖定的方法,此外dependencyManagement只是聲明依賴,并不自動實現(xiàn)引入,因此子項目需要顯示的聲明需要用的依賴
原文鏈接:https://blog.csdn.net/qq_43985303/article/details/133904512
- 上一篇:沒有了
- 下一篇:沒有了
相關(guān)推薦
- 2022-07-30 Oracle鎖表解決方法的詳細記錄_oracle
- 2022-05-03 C#面向?qū)ο笤O(shè)計原則之里氏替換原則_C#教程
- 2022-07-11 Android?Studio實現(xiàn)注冊頁面跳轉(zhuǎn)登錄頁面的創(chuàng)建_Android
- 2022-07-02 python等間距取值方式_python
- 2022-04-09 WPF使用ValidationRules對MVVM架構(gòu)數(shù)據(jù)驗證_基礎(chǔ)應(yīng)用
- 2022-03-18 .NET?6開發(fā)TodoList應(yīng)用之實現(xiàn)全局異常處理_實用技巧
- 2022-01-11 npm install 報錯 gyp info it worked if it ends with
- 2022-03-28 通過numba模塊給Python代碼提速的方法詳解_python
- 欄目分類
-
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支