首先我們在idea中創建一個maven工程,我們只關注pom.xml
以及External Libraries
中導入的jar包
導入spring-beans.jar
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>4.1.2.RELEASE</version>
</dependency>
再看左側
再看下jar包依賴
可以發現spring-beans.jar
依賴於spring-core.jar
,
spring-core.jar
依賴於commons-logging
,當然這也是spring
唯一依賴的外部jar包
一、路徑最短原則
那如果我們手動添加了一個spriing-core.jar
,但是版本號是4.3.18
,那么最終引入的依賴是哪個呢?
當然是4.3.18
版本的,這是因為寫在pom.xml
是直接依賴,而由spring-bean.jar
引入的spring-core.jar
是間接依賴,直接依賴優先於間接依賴。
二、聲明優先原則
讓我們回到開始 的情況,
我們加入spring-context.jar
,
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>4.1.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.3.18.RELEASE</version>
</dependency>
</dependencies>
我們看下依賴樹:
可
以發現spring-beans.jar
和spring-context.jar
都依賴於spring-core.jar
,
那猜一下,按上面這種方式,是導入了兩個版本的spring-core呢?還是導入了一個版本的呢,導入一個版本的那么它的版本號是多少呢?
現在再來看導入的依賴
發現導入的是4.1.2
現在換下兩個依賴的位置
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.3.18.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>4.1.2.RELEASE</version>
</dependency>
</dependencies>
再來看導入的依賴
發現導入spring-core變成了4.3.18的版本
這就是聲明優先原則,即在pom.xml中所處的位置越靠前,越優先。
三、直接排除法(推薦使用)
此時我們手動排除掉目前的4.3.18版本的spring-core.jar
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.3.18.RELEASE</version>
<exclusions>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>4.1.2.RELEASE</version>
</dependency>
</dependencies>
再來看依賴
可以發現spring-core.jar
的版本又變成了4.1.2。
這里spring-core不需要寫版本號,默認即4.3.18
以上即為maven排除Jar包沖突的三種方式,建議使用第三種,更加直觀。