Maven中jar包冲突是开发过程中比较常见而又令人头疼的问题,我们需要知道 jar包冲突的原理,才能更好的去解决jar包冲突的问题。本文将从jar包冲突的原理和解决两个方面阐述Maven中jar包冲突的解决办法。
一、Maven中jar包冲突产生原因
MAVEN项目运行中如果报如下错误:
Caused by:java.lang.NoSuchMethodError
Caused by: java.lang.ClassNotFoundException
十有八九是Maven jar包冲突造成的。那么jar包冲突是如何产生的?
首先我们需要了解jar包依赖的传递性。
当我们需要A的依赖的时候,就会在pom.xml中引入A的jar包;而引入的A的jar包中可能又依赖B的jar包,这样Maven在解析pom.xml的时候,会依次将A、B 的jar包全部都引入进来。
举个例子:
在Spring Boot应用中导入Hystrix和原生Guava的jar包:
<!--原生Guava API-->
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>20.0</version>
</dependency>
<!--hystrix依赖(包含对Guava的依赖)-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
<version>1.4.4.RELEASE</version>
</dependency>
利用Maven Helper插件得到项目导入的jar包依赖树:
从图中可以看出Hystrix包含对Guava jar包依赖的引用: Hystrix -> Guava,所以在引入Hystrix的依赖的时候,会将Guava的依赖也引入进来。
那么jar包是如何产生冲突的?
假设有如下依赖关系:
A->B->C->D1(log 15.0):A中包含对B的依赖