1. Maven 依赖传递特性
概念
假如有 Maven 项目A,项目 B 依赖 A,项目 C 依赖 B。那么我们可以说 C 依赖 A。也就是说,依赖的关系为: C —>B—>A , 那么我们执行项目 C 时,会自动把 B、A 都下载导入到 C 项目的 jar 包文件夹中,这就是依赖的传递 性。
作用
简化依赖导入过程
确保依赖版本正确
传递的原则
在 C 依赖 B , B 依赖 A 的前提下,A 是否能够传递到 C,取决于 B 依赖 A 时使用的依赖范围以及配置
. B 依赖 A 时使用 compile 范围:可以传递
. B 依赖 A 时使用 test 或 provided 范围:不能传递,所以需要这样的 jar 包时,就必须在需要的地方明确配置 依赖才可以
. B 依赖 A 时,若配置了以下标签,则不能传递
<dependency>
<groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.2.15</version>
<optional>true</optional>
</dependency>
依赖传递终止的情况
. 非 compile 范围进行依赖传递
. 使用 optional 配置终止传递
. 依赖冲突(传递的依赖已经存在)
案例:导入 jackson 依赖
分析:jackson 需要三个依赖
依赖传递关系: data-bind 中,依赖其他两个依赖:
最佳导入:直接可以导入 data-bind,自动依赖传递需要的依赖
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId>
<version>2.10.0</version>
</dependency>
2. Maven 依赖冲突特性
当直接引用或者间接引用出现了相同的 jar 包! 这时呢, 一个项目就会出现相同的重复 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)
在<dependencies></dependencies>中,先声明的,路径相同,会优先选择!
方式二:手动排除
<dependency>
<groupId>com.xszx</groupId>
<artifactId>pro01-maven-java</artifactId>
<version>1.0-SNAPSHOT</version> <scope>compile</scope>
<!-- 使用excludes标签配置依赖的排除 -->
<exclusions>
<!-- 在exclude标签中配置一个具体的排除 -->
<exclusion>
<!-- 指定要排除的依赖的坐标(不需要写version) -->
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId> </exclusion>
</exclusions> </dependency>