Maven依賴沖突在IDEA中的簡單解決方案


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插件。

image-20220927231933204

安裝之后,pom文件出會出現這個選項。

image-20220927232004704

白色的是當前解析的版本,紅色的就是沖突的版本,然后根據實際情況選擇排查哪個,右鍵會出現exclude(排除)選項,點擊后就會自動在pom文件里幫你添加exclude。

image-20220927232854604

右鍵可以排除它

image-20220927232557378

你看圖里這個節點就會自動幫你追加exclude。

image-20220927232938435

image-20220927232245204

2.利用idea的pom圖幫助你分析

如果你想深入分析一波的話,不然這里不用看了.

在pom文件中,我們手動引入了mapstruct 1.4.1.Final這個包。

image-20220420074506679

同時在下方引入了springfox 3.0.0這個包

image-20220420074531578

這個時候項目是能正常啟動的,因為我們在根pom文件中指明了mapstruct的版本為1.4.1.Final

不過,當我們看依賴樹的時候,會發現紅色的線。

image-20220420074914600

image-20220420075514379

以上圖這個最下方的地方為例,除了紅色的線,我們還能點擊另一條線看到另一引用位置。

查看時長按Alt可以有放大鏡效果

image-20220420075702896

這是啥意思呢,就是說springfox-swagger2這里也用到了mapstruct,查看到它的版本是1.3.1.Final。

image-20220420075846334

這個時候我們就可以根據自己項目的實際情況,保留一個版本即可,比如去掉這個1.3.1的。

image-20220420080037830

點擊后,這條線就消失了。

image-20220420080102209

通過springfox-boot-starter- > springfox-swagger2 -> mapstruct這條路徑排除掉了冗余的1.3.1版本。

然后你會看到pom文件里多了一行這個。

image-20220420080125915

好啦大致的過程就是這樣。

再強調一遍,這里我偷懶了,其實我不排這個包也沒問題,因為我項目的根pom中有指明版本,項目是正常啟動的。

我的本意是當你遇到依賴沖突問題時,按照上面的思路進行處理。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM