1、依赖的传递性
1. 概念
A 依赖 B,B 依赖 C,那么在 A 没有配置对 C 的依赖的情况下,A 里面能不能直接使用 C?
2. 传递的原则
在 A 依赖 B,B 依赖 C 的前提下,C 是否能够传递到 A,取决于 B 依赖 C 时使用的依赖范围。
- B 依赖 C 时使用 compile 范围:可以传递
- B 依赖 C 时使用 test 或 provided 范围:不能传递,所以需要这样的 jar 包时,就必须在需要的地方明确配置依赖才可以。
2. 使用 compile 范围依赖 spring-core
测试方式:让 pro01-maven-java 工程依赖 spring-core
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>4.0.0.RELEASE</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
</dependencies>
使用 mvn dependency:tree 命令查看效果: 可以看到spring-core依赖commons-logging,junit依赖hamcrest-core,查看本项目所有依赖的jar包: 将pro01-maven-java重新安装,maven的本地仓库中就有了pro01-maven-java的最新jar包:
mvn clean install
由于pro02-maven-web项目的pom文件中导入了pro01-maven-java项目的jar包依赖:
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.atguigu.maven</groupId>
<artifactId>pro01-maven-java</artifactId>
<version>1.0-SNAPSHOT</version>
<scope>compile</scope>
</dependency>
</dependencies>
所以在pro02-maven-web中也可以看到spring-core的依赖,执行mvn dependency:list 命令:
3. 验证 test 和 provided 范围不能传递
pro01-maven-java 依赖了 junit,但是在 pro02-maven-web 工程中查看依赖树的时候并没有看到 junit。所以 test 范围不能传递。
在 pro01-maven-java 依赖 servlet-api ,但是在 pro02-maven-web 工程中查看依赖树的时候并没有看到 servlet,所以 provided 范围不能传递。
|