0.背景
- 原因
maven依賴沖突,無非就是導入了多個版本的依賴包,程序里不知道用哪個了。
在我們目前的項目中使用了A和B兩個包,A包在依賴中依賴了C包,而B包在依賴中也依賴了C包。但是A包依賴的C的1.0版本,B依賴C包的是2.0版本。
此時,我們的項目中就出現了1.0.和2.0兩個版本的C包。
此時Maven會依賴路徑最短優先原則,來決定使用哪個版本的Jar包,而另外一個無用的Jar包則未被使用,這就是所謂的依賴沖突。
在大多數的時候,依賴沖突並不會對系統造成異常,因為Maven始終會選擇一個Jar包來使用,但是在特定的情況下因為Jar包版本不同會造成找不到類的異常。
如果存在依賴沖突最好解決掉,不要給系統留下隱患。
對於依賴某個組件的多個版本,maven的仲裁過程,並不是簡單的使用高版本,而是根據從根節點到各個組件節點之間的路徑深度,路徑短的組件優先。
如果路徑深度相同,則是先發現的那個(POM中依賴聲明的順序、子pom內聲明的優先於父pom中的依賴),類似一棵樹的廣度遍歷。
maven有自己處理依賴沖突的方案為啥還會有依賴沖突這種問題?
- 解決
解決依賴沖突可以使用maven的exclusion標簽
手動排除A包或者B包中的那個沖突的C包
<exclusions>
<exclusion>
<groupId></groupId>
<artifactId></artifactId>
</exclusion>
</exclusions>
實例
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<exclusions>
<!-- 20210714去掉starter-logging -->
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
<!-- 20210714去掉logback -->
<exclusion>
<artifactId>logback-classic</artifactId>
<groupId>ch.qos.logback</groupId>
</exclusion>
</exclusions>
</dependency>
1.自動排除
idea里面安裝maven-helper插件。
安裝之后,pom文件出會出現這個選項。
白色的是當前解析的版本,紅色的就是沖突的版本,然后根據實際情況選擇排查哪個,右鍵會出現exclude(排除)選項,點擊后就會自動在pom文件里幫你添加exclude。
右鍵可以排除它
你看圖里這個節點就會自動幫你追加exclude。
2.利用idea的pom圖幫助你分析
如果你想深入分析一波的話,不然這里不用看了.
在pom文件中,我們手動引入了mapstruct 1.4.1.Final
這個包。
同時在下方引入了springfox 3.0.0
這個包
這個時候項目是能正常啟動的,因為我們在根pom文件中指明了mapstruct
的版本為1.4.1.Final
。
不過,當我們看依賴樹的時候,會發現紅色的線。
以上圖這個最下方的地方為例,除了紅色的線,我們還能點擊另一條線看到另一引用位置。
查看時長按Alt可以有放大鏡效果
這是啥意思呢,就是說springfox-swagger2
這里也用到了mapstruct,查看到它的版本是1.3.1.Final。
這個時候我們就可以根據自己項目的實際情況,保留一個版本即可,比如去掉這個1.3.1的。
點擊后,這條線就消失了。
通過springfox-boot-starter- > springfox-swagger2 -> mapstruct這條路徑排除掉了冗余的1.3.1版本。
然后你會看到pom文件里多了一行這個。
好啦大致的過程就是這樣。
再強調一遍,這里我偷懶了,其實我不排這個包也沒問題,因為我項目的根pom中有指明版本,項目是正常啟動的。
我的本意是當你遇到依賴沖突問題時,按照上面的思路進行處理。