Maven依赖协调原则及依赖顺序的影响

一、Maven依赖协调原则

1)POM的直接依赖,后声明的依赖有效

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?xml version="1.0"?>
<project
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<groupId>person.kivihub</groupId>
<artifactId>maven-demo</artifactId>
<version>1.0.0-SNAPSHOT</version>
<url>http://maven.apache.org</url>
<dependencies>
<!-- 被覆盖 -->
<dependency>
<groupId>com.thoughtworks.xstream</groupId>
<artifactId>xstream</artifactId>
<version>1.4.17</version>
</dependency>
<!-- 有效 -->
<dependency>
<groupId>com.thoughtworks.xstream</groupId>
<artifactId>xstream</artifactId>
<version>1.4.2</version>
</dependency>
</dependencies>
</project>

2)POM的间接依赖

DependencyManagement存在? 条件 优先原则
存在约束且约束中版本冲突 当前pom和父pom约束冲突 使用当前pom声明的约束版本
同一pom层级约束冲突 递归解析后,使用先声明的约束版本
不存在约束且间接依赖冲突 路径深度不同 使用路径最短的依赖
路径深度相同 使用先声明依赖

二、POM中依赖顺序的影响

1)冲突场景

1、无DependencyManagement

a、POM内的GA相同(relocation后)的直接依赖,顺序变化时影响解析结果

b、POM的GA相同(relocation后)间接依赖路径深度相同时,首个出现的顺序变化时影响解析结果

2、有DependencyManagement

同一pom内(同一层级)多个import的依赖约束(递归解析后)中包含对同一GA的约束冲突,先声明的有效。

2)影响结果

1、一定影响相冲突的依赖的版本

2、可能影响相冲突依赖的子依赖版本,冲突的依赖可能exclude内容不同。

三、结论

1)非必要,不要调整依赖的顺序。

2)推荐通过DependencyManagement声明依赖版本。

2)需要调整时,比较调整前后依赖解析结果是否一致。辅助命令mvn dependency:list

# 参考

  1. DependencyManagment作用
  2. Maven源码-依赖解析

评论