文章目錄
- 一、依賴沖突概念
- 1、什么是依賴沖突
- 2、依賴沖突的原因
- 3、如何解決依賴沖突
- 二、查看依賴沖突-maven-helper
- 1、安裝
- 2、helper使用
- 1、conflicts的閱讀順序(從下向上看)
- 2、dependencies as List的閱讀順序(從下向上看)
- 3、dependencies as Tree閱讀(從上向下看)
- 三、解決依賴沖突
- 1、排除指定版本(常用,推薦)
- 1、查看沖突
- 2、排除不需要的版本
- 3、查看pom依賴,刷新pom后
- 4、再次點擊【conflicts】,或者點擊【Refresh UI】進行刷新
- 2、使用第一聲明者優先原則
- 3、鎖定版本(推薦)
- 總結
一、依賴沖突概念
1、什么是依賴沖突
依賴沖突是指項目依賴的某一個jar包,有多個不同的版本,因而造成類包版本沖突,從而導致調試過程中出現類似類找不到,NoSuchMethodError等錯誤。
2、依賴沖突的原因
依賴沖突很經常是類包之間的間接依賴引起的。每個顯式聲明的類包都會依賴于一些其它的隱式類包,這些隱式的類包會被maven間接引入進來,從而造成類包沖突
3、如何解決依賴沖突
首先查看產生依賴沖突的類jar,其次找出我們不想要的依賴類jar,手工將其排除在外就可以了。
二、查看依賴沖突-maven-helper
安裝了Maven Helper插件,只要打開pom文件,就可以打開該pom文件的Dependency Analyzer視圖(在文件打開之后,文件下面會多出這樣一個tab),進入Dependency Analyzer視圖之后有三個查看選項,分別是Conflicts(沖突)、All Dependencies as List(列表形式查看所有依賴)、All Dependencies as Tree(樹結構查看所有依賴)。并且這個頁面還支持搜索。很方便!
1、安裝
2、helper使用
1、當Maven Helper 插件安裝成功后,打開項目中的pom文件,下面就會多出一個圖
2、打開pom文件,并可以切換tab,簡單使用
- Conflicts(查看沖突)
- All Dependencies as List(列表形式查看所有依賴)
- All Dependencies as Tree(樹形式查看所有依賴)
當前界面上還提供搜索功能 方便使用
1、conflicts的閱讀順序(從下向上看)
從圖中可以看出有哪些jar存在沖突,存在沖突的情況下最終采用了哪個依賴的版本。標紅的就是沖突版本,白色的是當前的解析版本。這個選項,需要從下向上看;
并且這里是:A依賴于B,B依賴于C,C依賴D。
如下圖:沖突的jar包就是jackson,swagger通過web、json最終依賴到jackson。
2、dependencies as List的閱讀順序(從下向上看)
dependencies as List 欄目和conflicts一樣,都是從下向上看,依次依賴。
3、dependencies as Tree閱讀(從上向下看)
datascope依賴securlty,再依賴system,再依賴core,再依賴到jackson
三、解決依賴沖突
1、排除指定版本(常用,推薦)
1、查看沖突
點擊【Conflicts】,從圖中可以看到那些jar包沖突。存在沖突的情況下最終選擇了那么版本。標紅的就是沖突版本,白色的是當前的解析版本。
如果有多個依賴的版本發生了沖突,那么只要把其中一個依賴給排除掉,只剩下一個依賴,那么自然就可以解決沖突的問題。我們只需要使用exclusion關鍵字對相關依賴進行排除就行
- 這里可以看到 spirng-beans-4.2.4.release和spring-beans-5.0.12沖突,這里舍棄spirng-beans-4.2.4.release這個版本,保留spring-beans-5.0.12 這個版本。使用 exclusion 排除定位到的沖突包。
2、排除不需要的版本
通過上邊的圖,我們一刻看到最終選擇了【4.2.4】版本,如果我要使用【5.0.12】版本。那么只需要吧【4.2.4】給排除掉。點擊【Exclude】進行排除即可。
3、查看pom依賴,刷新pom后
4、再次點擊【conflicts】,或者點擊【Refresh UI】進行刷新
2、使用第一聲明者優先原則
誰先定義的就用誰的傳遞依賴,即在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>
3、鎖定版本(推薦)
使用dependencyManagement 進行版本鎖定,dependencyManagement可以統一管理項目的版本號。這樣的話,導入依賴的時候就會直接使用我們鎖定的依賴版本。確保應用的各個項目的依賴和版本一致。
(1)在父項目的pom中進行約定
<dependencyManagement><dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId><version>5.2.0.RELEASE</version></dependency></dependencies></dependencyManagement>
這樣在后續的子工程中,就不用寫版本號了,直接就沿用副項目的版本號
(2):在同一個項目pom中,既約定版本號,又導入依賴
<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>
總結
綜上就是maven如何排查依賴沖突以及解決方法,
- 對于排查依賴個人比較推薦使用maven helper插件,
- 至于解決依賴沖突個人推薦使用版本鎖定的方法,此外dependencyManagement只是聲明依賴,并不自動實現引入,因此子項目需要顯示的聲明需要用的依賴