首先我們在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包沖突的三種方式,建議使用第三種,更加直觀。
