在解决冲突之前首先我们要知道什么是依赖冲突,这样可以更好的去锁定bug原因。下面通过一个代码示例来真正展示出依赖冲突。
依赖冲突代码演示
1、添加依赖
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.2.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.0.2.RELEASE</version>
</dependency>
</dependency>
2、观察依赖的层次结构
这里以core包来示例,spring和spring mvc都会依赖core包,这里我们会发现虽然我只导入了spring和spring mvc,但是maven却帮我们导入了,他所需要的相关jar包,这就是依赖的传递性。

3、运行项目jra包冲突直接报错
大概错误应该是找不到方法什么的,因为springmvc用的版本是5.0.2,而spring用的是4.2.4,依赖的传递他有一个就近原则,就是我spring依赖在上面所以他传递下来的就都是以spring的依赖版本为主的,也就是springmvc当中的core包相关包都会是4.2.4版本。版本之间肯定会有差异,所以有时候会报一些找不到方法或者类之类的错误。

解决Maven依赖冲突的思路
下面简单讲一下当我们出现依赖冲突的时候,我们解决依赖冲突的思路。针对于上面的报错,经测试只能采用第一种方式可行。
1、版本号统一
当我们能版本号统一的时候尽量版本号统一,这样可以直接的避免一些版本之间差异的问题。这里我们让spring和spring mvc统一版本,两个都用5.0.2版本的,再次运行成功解决报错。
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.0.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.0.2.RELEASE</version>
</dependency>
<dependencies>
2、路径最短者优先
这里我们还是以context包下的core包来做示例
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.2.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>5.0.2.RELEASE</version>
</dependency>
从这里可以看出5.0.2取代了4.2.4,这就是我们所说的路劲最短者优先,因为context的依赖虽然会自动导入core包,但是那就是属于下级依赖了,而5.0.2这个依赖和context这个依赖为同级,所以最终会取这个版本。

3、路径相同时先声明者优先
当我们把两个依赖顺序颠倒一下,会发现core包相关包都会是5.0.2版本,当然针对于上面问题,使用该方法仍然报错,因为有的时候版本之间是无法互相替代的,这个时候只能采用第一种版本号统一。
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.0.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.2.4.RELEASE</version>
</dependency>
</dependency>
当调换顺序之后我们会发现他会都引用5.0.2

4、排除依赖
jar包他是存在相互依赖的,就比如spring-context他依赖aop,和core包等,当他和别的jar包产生冲突的时候,我们可以考虑在保证项目在排除他的冲突jar包还可以正常运行和使用的情况下进行排除,从而解决依赖冲突的问题。
下面以core包为例,进行排除,首先打开pom然后打开依赖层次结构找到要排除的jar包以及层次,然后右键打开pom

打开pom之后我们可以找到他的坐标和模块名称

<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.0.2.RELEASE</version>
<exclusions>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
</exclusion>
</exclusions>
</dependency>
总结
总体来说解决冲突的方案就是以上几种,我们需要根据实际场景来进行选择性解决,看看哪一种方案更适合。