今天碰到了一个诡异的问题。
jedis版本原来用的是2.9.0,想要替换成3.0.1,涉及到父pom,搞了半天,试了各种办法,版本都改不过来。
项目依赖的始终是2.9.0,并且从当前pom到父pom,都找不到在哪里指定了2.9.0。
最终,采取下述方法1,问题解决。
maven依赖冲突一般有四种解决方式,按照优先级(从高到低)介绍:
1. 依赖管理(所有版本锁定)
在配置文件pom.xml中先声明要使用哪个版本的相应jar包,声明后其他版本的jar包一律不依赖
<properties>
<spring.version>4.2.4.RELEASE</spring.version>
<hibernate.version>5.0.7.Final</hibernate.version>
<struts.version>2.3.24</struts.version> </properties>
</properties>
<!-- 锁定版本,struts2-2.3.24、spring4.2.4、hibernate5.0.7 -->
<dependencyManagement> <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId><version>${spring.version}</version> </dependency> </dependencies></dependencyManagement>
如果是应用在同一个工程内有多个模块时,提取出一个父亲模块来管理子模块共同依赖的 jar 包版本,则子模块相同jar包不需要指定version信息
2. 移除依赖
如果我们不想通过 A->B->C>D1 引入 D1 的话,那么我们在声明引入 A 的时候将 D1 排除掉
举个例子:将 zookeeper 的 jline 依赖排除
<dependency><groupId>org.apache.hadoop</groupId><artifactId>zookeeper</artifactId><version>3.3.1</version><exclusions><exclusion><groupId>jline</groupId><artifactId>jline</artifactId></exclusion></exclusions></dependency>
3. 第一声明优先原则
在pom.xml配置文件中,如果有两个名称相同版本不同的依赖声明,那么先写的会生效。
所以,先声明自己要用的版本的jar包即可。
4. 最短路径优先
直接依赖优先于传递依赖,如果传递依赖的jar包版本冲突了,那么可以自己声明一个指定版本的依赖jar,即可解决冲突。