一、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
。
# 参考
- DependencyManagment作用
- Maven源码-依赖解析