一、冲突的出现原因
使用pom.xml文件添加dependecy(依赖)的时候,虽然,我们定义的dependecy不可能存在同一个依赖有两个版本,但是由于依赖还会引用别的依赖,这个时候就会有依赖冲突的情况出现。比如我们的项目引入两个依赖A、B,而A还引入依赖C1.0,B引入依赖C2.0,这个时候就面临该用哪个版本的C的问题了。如下图所示。
![](https://img.haomeiwen.com/i9294298/32598ade38c92db6.jpg)
二、maven如何自动解决冲突的依赖
maven解决版本冲突主要是两个原则。
-
路径最短原则:如上图E1的路径是“项目-A-E1”,E2的路径是“项目-B-F-E2”,因为E1路径比E2短,所以最终会选择E1而不用E2。
-
优先声明原则:当出现路径长短相同的时候,谁先声明就用谁。如F1和F2的路径距离相同,但是由于F1比F2先声明(B比C先声明),所以最终使用F1。
三、手动解决冲突
当然,有时maven的自动解决依赖冲突并不能满足我们的要求,这个时候就需要我们自己选择使用什么版本了。
1、在Intellij下如何查看冲突
打开pom.xml,在文件里,右键,如下图所式:
![](https://img.haomeiwen.com/i9294298/bf98eaf7ed139467.jpg)
红线部分就是有冲突并被舍弃的依赖。选择其中一个依赖,会看到所有相同依赖的不同版本都会被 红虚线 连接起来。这些不同版本的依赖中一定会有一个与父依赖没有用红实线连接的,而是用正常的蓝线连接,这个就是被选择并使用的依赖。如下图:
![](https://img.haomeiwen.com/i9294298/b3507c35fff1b140.png)
2、手动排除依赖
只需要在dependecy标签下,加入exclusions,如下
<dependency>
<groupId>net.sf.json-lib</groupId>
<artifactId>json-lib</artifactId>
<version>2.1</version>
<exclusions>
<exclusion>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
</exclusion>
</exclusions>
</dependency>
网友评论