Maven 依赖冲突以及排除(二)

发布时间 2023-12-29 15:01:36作者: 唏嘘-

1、依赖冲突:

当服务启动或者调用发生如下异常时,NoSuchMethodError,ClassNotFoundException 等。则一般是因为jar包冲突引起的。

大多数依赖冲突,maven的传递依赖会引入很多隐式的依赖,依赖的版本和实际使用的版本不一致导致的。

2、依赖的原则:

原则一:最短路径优先
最短路径优先: 当依赖声明不在同一个POM文件中时,或者说存在依赖传递时,路径最短的jar包将被选为最终依赖。
原则二:第一声明者优先
第一声明者优先: 当依赖声明不在同一个POM文件中时,或者说存在依赖传递时,并且依赖传递长度相同时,最先声明的依赖将被选为最终依赖。
原则三:覆盖优先
覆盖优先: 当依赖声明在同一个POM文件中时,后面声明的依赖将覆盖前面声明的依赖。

(1)路径最短优先原则

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

 <dependency>
   <groupId>org.springframework</groupId>
   <artifactId>spring-core</artifactId>
   <version>5.0.2.RELEASE</version>
 </dependency>
这里可以看出5.0.2取代了4.2.4,这就是我们所说的路劲最短者优先,因为context的依赖虽然会自动导入core包,但是那就是属于下级依赖了,
而5.0.2这个依赖和context这个依赖为同级,所以最终会取这个版本。

 (2)路径相同时先声明者优先

先统一版本号,然后把两个依赖顺序颠倒一下,会发现core包相关包都会是5.0.2版本
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>5.0.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.0.2.RELEASE</version>
</dependency>

 

3、依赖冲突解决

<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>5.0.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.0.2.RELEASE</version>
<exclusions>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
</exclusion>
</exclusions>
</dependency>