什么是依赖冲突
Maven是个很好用的依赖管理工具,但是再好的东西也不是完美的。Maven的依赖机制会导致Jar包的冲突。举个例子,现在你的项目中,使用了两个Jar包,分别是A和B。现在A需要依赖另一个Jar包C,B也需要依赖C。但是A依赖的C的版本是1.0,B依赖的C的版本是2.0。这时候,Maven会将这1.0的C和2.0的C都下载到你的项目中,这样你的项目中就存在了不同版本的C,这时Maven会依据依赖路径最短优先原则,来决定使用哪个版本的Jar包,而另一个无用的Jar包则未被使用,这就是所谓的依赖冲突。
如何查看依赖冲突
使用Maven命令:
1
2
cd <含有pom.xml的文件夹>
mvn dependency:tree -Dverbose -DoutputFile=<文件名>.txt
-(io.netty:netty-common:jar:4.0.56.Final:compile - omitted for duplicate
表示存在依赖冲突。
-(io.netty:netty-common:jar:4.0.56.Final:compile - omitted for conflict with 4.1.36
表示存在依赖冲突并且强制使用了4.1.36版本。
如何解决依赖冲突
解决依赖冲突的方法,就是使用Maven提供的标签,就像下面这样:
1
2
3
4
5
6
7
8
9
10
11
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.10.0</version>
<exclusions>
<exclusion>
<artifactId>log4j-api</artifactId>
<groupId>org.apache.logging.log4j</groupId>
</exclusion>
</exclusions>
</dependency>
log4j-core本身是依赖了log4j-api,但是因为一些其他的模块也依赖了log4j-api,并且两个log4j-api版本不同,所以我们使用标签排除掉log4j-core所依赖的log4j-api,这样Maven就不会下载log4j-core所依赖的log4j-api了,也就保证了我们的项目中只有一个版本的log4j-api。