Maven依赖冲突解决方法

Maven依赖冲突解决方法

Posted by SFHJavaer on 2022-04-28
Estimated Reading Time 5 Minutes
Words 1.1k In Total
Viewed Times
Maven依赖冲突解决方法

项目的pom.xml形如下:

项目会引用5.2.7.RELEASE的spring core jar包

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.7.RELEASE</version>
</dependency>

<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>5.2.0.RELEASE</version>
</dependency>
</dependencies>


依赖冲突是指项目依赖中的jar包有多个版本,造成了版本冲突,经常是由于类包之间的间接依赖(隐式包)(造成了不同版本依赖的重复引入和共存)形成的

如何解决:

首先查看产生依赖冲突的jar,通过dependency:tree命令来检查版本冲突(不建议)

使用maven helper插件进行排查依赖,解决冲突使用版本锁定的方法

安装插件之后打开pom文件,下面会出现一个“依赖分析”选项,插件中有三个选项,Conflicts代表查看冲突、下两个选项是已列表或者树的形式展示所有依赖,点击以来冲突依赖之后,点击产生冲突的jar包,右侧会显示具体产生的jar版本

之后再手动去pom修改依赖,具体可以根据三个原则进行依赖冲突解决:
a、使用第一声明者优先原则
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>5.2.0.RELEASE</version>
</dependency>

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

</dependencies>


依赖都放在dependencies中,谁先定义的就引用谁的依赖,自上而下

b、使用路径近者优先原则:即直接依赖级别高于传递依赖。

直接指定具体的依赖的版本:下面项目引入是 spring core 5.2.0的包

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.7.RELEASE</version>
</dependency>

<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>5.2.0.RELEASE</version>
</dependency>

<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>5.2.0.RELEASE</version>
</dependency>



</dependencies>

c、排除依赖

排除依赖如果是idea,可以使用maven helper插件进行排除。点开pom.xml,切换到Dependency Analyzer视图,选择All Dependencies as Tree,在依赖树图中进行排除,右键jar,直接选择Exclude选项进行删除

产生的pom影响如下:项目引入是 spring core 5.2.0的包,在pom中使用exclusions标签对依赖中的传递依赖进行排除

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.7.RELEASE</version>
<exclusions>
<exclusion>
<artifactId>spring-core</artifactId>
<groupId>org.springframework</groupId>
</exclusion>
</exclusions>
</dependency>

<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>5.2.0.RELEASE</version>
</dependency>

</dependencies>


d、版本锁定(推荐)

使用dependencyManagement 进行版本锁定,dependencyManagement可以统一管理项目的版本号,确保应用的各个项目的依赖和版本一致。

下面可以看到项目引入是 spring core 5.2.0的包

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<--!>
<version>5.2.0.RELEASE</version>
</dependency>
</dependencies>
</dependencyManagement>

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

<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>5.2.0.RELEASE</version>
</dependency>

</dependencies>


总结

综上就是maven如何排查依赖冲突以及解决方法,对于排查依赖个人比较推荐使用maven helper插件,至于解决依赖冲突个人推荐使用版本锁定的方法,此外dependencyManagement只是声明依赖,并不自动实现引入,因此子项目需要显示的声明需要用的依赖


如果您喜欢此博客或发现它对您有用,则欢迎对此发表评论。 也欢迎您共享此博客,以便更多人可以参与。 如果博客中使用的图像侵犯了您的版权,请与作者联系以将其删除。 谢谢 !