什么是Maven的依赖冲突呢?
举个例子,假如A和B都依赖了一个C,但这个C是不同版本的。这时,D又要依赖A和B,那么C就是D的传递依赖了。但是因为C有两个不同的版本,不知道该选哪个,D表示很苦恼。——这就是依赖冲突了。
遇到依赖冲突,我们有两条原则:
一、 短路优先(优先解析传递路径短的版本)。
例如:
第一条依赖路径:A → B → C → X(jar)
第二条依赖路径:A → D →X(jar)
因为第二条依赖路径相对来说最短,所以A会依赖第二条路径X的版本。
为了更加清楚的解释这一点,接下来我会在Eclipse中做实验:
- 首先打开百宝箱,找到【commons-io】,如图:
- 点击红框的Item,进入详情:
好多版本啊,既然我们要实验版本冲突,那么我这次就使用2.5和1.4吧~
2.5版本的依赖:
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.5</version>
</dependency>
1.4版本的依赖:
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>1.4</version>
</dependency>
到此呢,先不要急着往下走,现在回想一下上篇的内容,想不起来戳→Maven传递依赖
上篇我们讲:A依赖B ,B依赖C,那么A和C时传递依赖关系。
现在我们增加一点复杂性,以完成依赖冲突这个课题。现在让C依赖【commons-io的1.4版本】,让B依赖【commons-io的2.5版本】,看A最终会依赖哪个版本呢?
如上所述,短路优先这个原则是正确的。
二、 先声明先优先(如果依赖路径长度相同,则谁先声明,先解析谁)。
为了验证这个结论,还需要再次更改我们项目。现在我们改成:A同时直接依赖B和C。
A的pom.xml内容,注意顺序哦,C在B前边声明:
<dependency>
<groupId>com.amber.maventest</groupId>
<artifactId>maventest-c</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.amber.maventest</groupId>
<artifactId>maventest-b</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
以后遇到此类问题,就知道为什么了吧~