Maven依赖传递和依赖冲突
2025/9/17大约 2 分钟
Maven依赖传递和依赖冲突
依赖传递冲突解决1. 依赖传递特性
概念
假如有Maven项目A,项目B依赖A,项目C依赖B。那么C也会自动依赖A,这就是依赖的传递性。
作用
- 简化依赖导入过程
- 确保依赖版本正确
传递原则
- B依赖C时使用
compile
范围:可以传递 - B依赖C时使用
test
或provided
范围:不能传递 - B依赖C时,若配置
<optional>true</optional>
:终止传递
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.15</version>
<optional>true</optional> <!-- 终止依赖传递 -->
</dependency>
依赖传递终止情况
- 非compile范围
- 使用optional配置
- 依赖冲突(传递的依赖已经存在)
案例:导入jackson依赖
分析:jackson需要三个依赖
依赖传递关系:data-bind中,依赖其他两个依赖
只需导入jackson-databind
,会自动传递所需依赖:
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.10.0</version>
</dependency>
2. 依赖冲突特性
当直接或间接引用出现了相同的jar包时,会发生依赖冲突。Maven会自动选择合适的依赖。
自动选择原则
- 短路优先原则:依赖路径短的优先(第一原则)
A—>B—>C—>D—>E—>X(version 0.0.1)
A—>F—>X(version 0.0.2)
则A依赖于X(version 0.0.2)。 - 路径长度相同,先声明优先
A—>E—>X(version 0.0.1)
A—>F—>X(version 0.0.2)
在<depencies></depencies>
中,先声明的,路径相同,会优先选择!
手动排除
<dependency>
<groupId>com.atguigu.maven</groupId>
<artifactId>pro01-maven-java</artifactId>
<version>1.0-SNAPSHOT</version>
<scope>compile</scope>
<exclusions>
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
小结
Maven依赖传递极大简化了依赖管理,但也可能带来依赖冲突。理解传递和冲突解决机制,有助于高效管理大型项目依赖。