依賴衝突是指項目依賴的某一個jar包,有多個不一樣的版本,於是形成類包版本衝突java
依賴衝突很常常是類包之間的間接依賴引發的。每一個顯式聲明的類包都會依賴於一些其它的隱式類包,這些隱式的類包會被maven間接引入進來,從而形成類包衝突spring
首先查看產生依賴衝突的類jar,其次找出咱們不想要的依賴類jar,手工將其排除在外就能夠了。具體執行步驟以下express
a、經過dependency:tree是命令來檢查版本衝突maven
mvn -Dverbose dependency:tree
複製代碼
當敲入上述命令時,控制檯會出現形以下內容ide
[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包被重複依賴,最後寫着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版本會被項目引用idea
b、若是是idea,能夠安裝maven helper插件來檢查依賴衝突spa
maven helper插件安裝成功,點開pom.xml會發現多了一個Dependency Analyzer視圖,以下 插件
上面按鈕的圖標含義以下上圖說明有3個jar存在衝突,點擊衝突的jar,能夠查看和哪一個jar產生衝突,以下圖 code
項目的pom.xml形以下cdn
<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>
複製代碼
經過查看依賴樹,咱們知道項目會引用5.2.7.RELEASE的spring core jar包,而不會引用5.2.0的jar包,若是咱們想用5.2.0版本的spring core包,咱們該如何作?
a、使用第一聲明者優先原則
誰先定義的就用誰的傳遞依賴,即在pom.xml文件自上而下,先聲明的jar座標,就先引用該jar的傳遞依賴。所以咱們若是要使用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>
複製代碼
查看依賴樹
[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)
複製代碼
經過依賴樹,咱們能夠看到項目已經引入5.2.0版本的spring core包
b、使用路徑近者優先原則
即直接依賴級別高於傳遞依賴。所以咱們能夠在最早的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>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>5.2.0.RELEASE</version>
</dependency>
</dependencies>
複製代碼
經過上圖能夠看到項目引入是 spring core 5.2.0的包
c、排除依賴
排除依賴若是是idea,可使用maven helper插件進行排除。點開pom.xml,切換到Dependency Analyzer視圖,選擇All Dependencies as Tree,點擊要排除的jar,右鍵會出現Execlude選項,以下
它產生的效果和以下配置是同樣<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>
複製代碼
經過上圖能夠看到項目引入是 spring core 5.2.0的包
四、版本鎖定
使用dependencyManagement 進行版本鎖定,dependencyManagement能夠統一管理項目的版本號,確保應用的各個項目的依賴和版本一致。
若是咱們項目中只想使用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>
複製代碼
經過上圖能夠看到項目引入是 spring core 5.2.0的包
綜上就是maven如何排查依賴衝突以及解決方法,對於排查依賴我的比較推薦使用maven helper插件,至於解決依賴衝突我的推薦使用版本鎖定的方法,此外dependencyManagement只是聲明依賴,並不自動實現引入,所以子項目須要顯示的聲明須要用的依賴