Maven中解决jar包冲突的三种方式
首先我们在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包冲突的三种方式,建议使用第三种,更加直观。
你所看得到的天才不过是在你看不到的时候还在努力罢了!