1、依赖传递的概念
pom.xml 中引入的依赖,在构建或运行时所有必要的类和资源都会自动添加到项目的 classpath 中。
Maven 中的依赖是有传递(Transitive)性的,默认会包含传递的依赖,这样就不用手动引用每一个依赖了。比如下面这个依赖关系中,A 依赖 B,B 依赖了 C……,如果你依赖 A 的话,就会自动包含 A/B/C/D/E。
2、依赖传递存在的问题
由于传递依赖,D 2.0
和 D 1.0
都会被加入 ClassPath 中,但因为它们版本不同,很可能会有包冲突等一系列问题。
3、解决依赖传递的方式
解决这个依赖传递导致的冲突问题,有两种方案:
(1)在使用者,也就是发起依赖方进行排除
<dependency> <groupId>group-a</groupId> <artifactId>artifact-a</artifactId> <version>1.0</version> <exclusions> <exclusion> <groupId>group-c</groupId> <artifactId>excluded-artifact</artifactId> </exclusion> </exclusions> </dependency>
(2)在提供方,将依赖的范围定义为不传递,这样在构建时就不会包含这些不传递的依赖包了。也有两种方式:
使用<scope>provided</scope>
<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.0</version> <scope>provided</scope> </dependency>
使用<optional>true</optional>
<dependency> <groupId>com.coohua.caf</groupId> <artifactId>caf-boot-starter-web</artifactId> <optional>true</optional> </dependency>