maven依赖调解

项目有以下依赖:

1
2
3
4
5
6
7
8
9
10
<dependency>
<groupId>com.vips.components</groupId>
<artifactId>vips-common-cache</artifactId>
<version>2.0</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.9</version>
</dependency>

其中

vips-common-cache —> vip-common-util —> commons-codec(1.6)

poi —> commons-codec(1.5)

使用 mvn dependency:tree 分析依赖后,发现maven实际使用的是 poi下的commons-codec(1.5)

再来看以下情形:

1
2
3
4
5
6
7
8
9
10
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.4.1</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.9</version>
</dependency>

httpclient —> commons-codec(1.9)

poi —> commons-codec(1.5)

分析依赖后发现,maven选择了commons-codec(1.9)

结论:

maven遇到依赖冲突后,主要两种原则解决:

1.路径优先原则:如第一个例子,

vips-common-cache —> vip-common-util —> commons-codec(1.6)

poi —> commons-codec(1.5)

commons-codec(1.6)路径深度是3, commons-codec(1.5)是2,所以maven选择较短路径的那个

2.声明优先原则:如第二个例子,当冲突依赖所处的路径相同,声明在前的会被引用

Maven