Maven中jar包衝突的解決方式

  • 2019 年 10 月 6 日
  • 筆記

現象

創建一個maven工程,引入spring-context包。

        <dependency>              <groupId>org.springframework</groupId>              <artifactId>spring-context</artifactId>              <version>5.0.8.RELEASE</version>          </dependency>

此時看左側的lib,我們發現引入了一個坐標,多出了很多的jar包,這個現象叫做依賴傳遞,就是說,當前坐標所依賴的jar包也會一同引入進來,這裡的版本都是5.0.8的。

接下來,我們再引入一個springmvc。我們換一個版本,我們引入4.2.4版本

        <dependency>              <groupId>org.springframework</groupId>              <artifactId>spring-webmvc</artifactId>              <version>4.2.4.RELEASE</version>          </dependency>

我們通過idea給的maven分析圖可以看出,mvc和context都依賴與sprng-core一個,依賴的是5.0.8版本,一個依賴的是4.2.4版本。

那麼真正載入的是哪個版本呢。是5.0.8版本。

此時就是存在了jar包的衝突問題,那麼我們解決這個問題,有三種方式。

聲明優先原則

此時我們的pom文件中是先聲明的5.0.8版本,後聲明的4.2.4版本,我們將其調換順序。


此時我們發現他們共同依賴的jar包,都變成了4.2.4版本,這就是聲明優先原則。

就近優先原則

比如,我們不想調換順序,我們就是想使用4.2.4版本的spring-core。我們可以單獨引入進來。

此時再看,我們發現依賴的spring-core已經變成了4.2.4版本了。

這個就是就近優先原則,就近優先是直接依賴,直接依賴的優先順序大於傳遞依賴的優先順序。

排除依賴

這種方式我們可以直接排除spring-context中的spring-core的傳遞依賴。

再看依賴,此時已經改為4.2.4.

使用exclusions標籤的時候,其內部不用寫版本號,這是唯一不用寫版本號的一種情況。因為他默認就去找當前依賴的版本了。