1.如果发生冲突如何解决
1.首先确保 jar 依赖没有缓存,可以先清除 idea的缓存
2.然后 重新compile 项目 可以使用如下命令:
mvn clean compile -U
3.接着可以通过查看依赖树 如下命令:
mvn dependency:tree>tt.txt
可以在本地项目上查看 tt.txt 然后搜搜冲突的jar 包,然后根据冲突报错排除掉不需要的jar。
2.基础原则
解决方式
1、第一声明优先原则:
在pom.xml配置文件中,如果有两个名称相同版本不同的依赖声明,那么先写的会生效。
所以,先声明自己要用的版本的jar包即可。
2、路径近者优先:
直接依赖优先于传递依赖,如果传递依赖的jar包版本冲突了,那么可以自己声明一个指定版本的依赖jar,即可解决冲突。
3、排出原则:
传递依赖冲突时,可以在不需要的jar的传递依赖中声明排除,从而解决冲突。
例子:
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-spring-plugin</artifactId>
<version>2.3.24</version>
<exclusions>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
</exclusion>
</exclusions>
</dependency>
4、版本锁定原则(最常使用)
在配置文件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>
<!-- 锁定版本,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>
3.如何通过冲突报错寻找具体的冲突jar是那个
如提示 com.google.common.collect.Sets$SetView.iterator() 中无 iterator 方法,第一我们只能大概猜测是 google 相关的jar,想要知道具体是那个jar ,我们可以在ide
a中搜索 com.google.common.collect.Sets 这样你会看到有多个 jar中找到次类,然后具体点开查看是那个jar 中 没有对应的iterator 方法;然后排除掉没有 iterator的jar;或者通过 显示引入最新的版本包含iterator方法的jar版本进来。