maven依赖冲突以及解决方法

什么是依赖冲突

依赖冲突是指项目依赖的某一个jar包,有多个不同的版本,因而造成类包版本冲突

依赖冲突的原因

依赖冲突很经常是类包之间的间接依赖引起的。每个显式声明的类包都会依赖于一些其它的隐式类包,这些隐式的类包会被maven间接引入进来,从而造成类包冲突

如何解决依赖冲突

首先查看产生依赖冲突的类jar,其次找出我们不想要的依赖类jar,手工将其排除在外就可以了。具体执行步骤如下

1、查看依赖冲突

a、通过dependency:tree是命令来检查版本冲突

mvn -Dverbose dependency:tree

当敲入上述命令时,控制台会出现形如下内容

[INFO] org.example:hello:jar:1.0-SNAPSHOT [INFO] +- org.springframework:spring-context:jar:5.2.7.RELEASE:compile [INFO] | +- (org.springframework:spring-aop:jar:5.2.7.RELEASE:compile - omitted for conflict with 5.2.0.RELEASE) [INFO] | +- org.springframework:spring-beans:jar:5.2.7.RELEASE:compile [INFO] | | \- (org.springframework:spring-core:jar:5.2.7.RELEASE:compile - omitted for duplicate) [INFO] | +- org.springframework:spring-core:jar:5.2.7.RELEASE:compile [INFO] | | \- org.springframework:spring-jcl:jar:5.2.7.RELEASE:compile [INFO] | \- org.springframework:spring-expression:jar:5.2.7.RELEASE:compile [INFO] | \- (org.springframework:spring-core:jar:5.2.7.RELEASE:compile - omitted for duplicate) [INFO] \- org.springframework:spring-aop:jar:5.2.0.RELEASE:compile [INFO] +- (org.springframework:spring-beans:jar:5.2.0.RELEASE:compile - omitted for conflict with 5.2.7.RELEASE) [INFO] \- (org.springframework:spring-core:jar:5.2.0.RELEASE:compile - omitted for conflict with 5.2.7.RELEASE)

其中omitted for duplicate表示有jar包被重复依赖,最后写着omitted for conflict with xxx的,说明和别的jar包版本冲突了,而该行的jar包不会被引入。比如上面有一行最后写着omitted for conflict with 5.2.7.RELEASE,表示spring-core 5.2.0版本不会被项目引用,而spring-core 5.2.7版本会被项目引用

b、如果是idea,可以安装maven helper插件来检查依赖冲突

maven helper插件安装成功,点开pom.xml会发现多了一个Dependency Analyzer视图,如下

Dependency Analyzer.png


上面按钮的图标含义如下

Conflicts(查看冲突)

All Dependencies as List(列表形式查看所有依赖)

All Dependencies as Tree(树形式查看所有依赖)

上图说明有3个jar存在冲突,点击冲突的jar,可以查看和哪个jar产生冲突,如下图

查看冲突.png

2、解决冲突

项目的pom.xml形如下

<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>

通过查看依赖树,我们知道项目会引用5.2.7.RELEASE的spring core jar包,而不会引用5.2.0的jar包,如果我们想用5.2.0版本的spring core包,我们该如何做?

a、使用第一声明者优先原则

谁先定义的就用谁的传递依赖,即在pom.xml文件自上而下,先声明的jar坐标,就先引用该jar的传递依赖。因此我们如果要使用5.2.0版本的spring core包,我们可以改成如下声明

<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>

查看依赖树

[INFO] org.example:hello:jar:1.0-SNAPSHOT [INFO] +- org.springframework:spring-aop:jar:5.2.0.RELEASE:compile [INFO] | +- org.springframework:spring-beans:jar:5.2.0.RELEASE:compile [INFO] | | \- (org.springframework:spring-core:jar:5.2.0.RELEASE:compile - omitted for duplicate) [INFO] | \- org.springframework:spring-core:jar:5.2.0.RELEASE:compile [INFO] | \- org.springframework:spring-jcl:jar:5.2.0.RELEASE:compile [INFO] \- org.springframework:spring-context:jar:5.2.7.RELEASE:compile [INFO] +- (org.springframework:spring-aop:jar:5.2.7.RELEASE:compile - omitted for conflict with 5.2.0.RELEASE) [INFO] +- (org.springframework:spring-beans:jar:5.2.7.RELEASE:compile - omitted for conflict with 5.2.0.RELEASE) [INFO] +- (org.springframework:spring-core:jar:5.2.7.RELEASE:compile - omitted for conflict with 5.2.0.RELEASE) [INFO] \- org.springframework:spring-expression:jar:5.2.7.RELEASE:compile [INFO] \- (org.springframework:spring-core:jar:5.2.7.RELEASE:compile - omitted for conflict with 5.2.0.RELEASE)

通过依赖树,我们可以看到项目已经引入5.2.0版本的spring core包

b、使用路径近者优先原则

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wsxdgz.html