测试依赖的传递性

145 阅读3分钟

测试依赖的传递性

@[toc]

1. 依赖的传递性

①概念

A 依赖 B,B 依赖 C,那么在 A 没有配置对 C 的依赖的情况下,A 里面能不能直接使用 C?

答案是:能的,因为 Maven 是支持 依赖之间的传递性的

②传递的原则

在 A 依赖 B,B 依赖 C 的前提下,C 是否能够传递到 A,取决于 B 依赖 C 时使用的依赖范围。

  • B 依赖 C 时使用 compile 范围:可以传递
  • B 依赖 C 时使用 testprovided 范围:不能传递,所以需要这样的 jar 包时,就必须在需要的地方明确配置依赖才可以。

注意:默认不写明<scope>compile</scope>依赖范围,默认就是compile 的依赖范围 。就是说,如果依赖范围是:compile,可以省略不写。

操作:背景是在:pro02-maven-web工程 依赖了 pro01-maven-java 工程的配置下的

2. 使用 compile 范围依赖 spring-core

测试方式:让 pro01-maven-java 工程依赖 spring-core

具体操作:编辑 pro01-maven-java 工程根目录下 pom.xml

<!-- https://mvnrepository.com/artifact/org.springframework/spring-core -->
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-core</artifactId>
  <version>4.0.0.RELEASE</version>
    <!--这里没有写明:<scope>compile</scope> 的依赖范围,因为默认不写明依赖,就是 compile -->
</dependency>

在这里插入图片描述

使用 mvn dependency:tree 命令查看效果:

mvn dependency:tree # 以树形结构查看当前项目的依赖视图

在这里插入图片描述

在这里插入图片描述

[INFO] --- maven-dependency-plugin:2.8:tree (default-cli) @ pro01-maven-java ---
[INFO] com.rainbowSea.maven:pro01-maven-java:jar:1.0-SNAPSHOT
[INFO] +- junit:junit:jar:4.12:test
[INFO] |  \- org.hamcrest:hamcrest-core:jar:1.3:test
[INFO] \- org.springframework:spring-core:jar:4.0.0.RELEASE:compile
[INFO]    \- commons-logging:commons-logging:jar:1.1.1:compile

还可以在 Web 工程中,使用 mvn dependency:tree 命令查看效果(注意:需要重新将 pro01-maven-java (因为 pro01-maven-java 项目有了新的更新,更新了新的依赖(spring-core))安装到本地仓库当中,不然在 Web 工程的 pro02-maven-web 工程当中无法找到其依赖到 pro01-maven-java 的jar 信息的):

如下是,我们没有更新:pro01-maven-java 时,查看其 pr02-maven-web 的依赖结构

mvn dependency:tree

在这里插入图片描述

这里我们重新:将 pro01-maven-java 安装到本地仓库:执行如下命令

mvn clean install # 先清除,在安装到本地,这样可以保证安装的是最新的

在这里插入图片描述

在这里插入图片描述

重新,安装更新 pro01-maven-java 到本地以后,再在 pro02-maven-web的项目依赖结构就可以看到了。

在这里插入图片描述

在这里插入图片描述

[INFO] --- maven-dependency-plugin:2.8:tree (default-cli) @ pro02-maven-web ---
[INFO] com.rainbowSea.maven:pro02-maven-web:war:1.0-SNAPSHOT
[INFO] +- junit:junit:jar:4.11:test
[INFO] |  \- org.hamcrest:hamcrest-core:jar:1.3:test
[INFO] +- javax.servlet:javax.servlet-api:jar:3.1.0:provided
[INFO] \- com.rainbowSea.maven:pro01-maven-java:jar:1.0-SNAPSHOT:compile
[INFO]    \- org.springframework:spring-core:jar:4.0.0.RELEASE:compile
[INFO]       \- commons-logging:commons-logging:jar:1.1.1:compile
[INFO] ------------------------------------------------------------------------

3. 验证 test 和 provided 范围不能传递

从上面的例子已经能够看到,pro01-maven-java 依赖了 junit,但是在 pro02-maven-web 工程中查看依赖树的时候并没有看到 junit。

要验证 provided 范围不能传递,可以在 pro01-maven-java 工程中加入 servlet-api 的依赖。

在这里插入图片描述

<dependency>
  <groupId>javax.servlet</groupId>
  <artifactId>javax.servlet-api</artifactId>
  <version>3.1.0</version>
  <scope>provided</scope>
</dependency>

同样先将:pro01-maven-java 更新,重新安装到本地仓库。 在这里插入图片描述

mvn clean install # 先清除,在安装到本地,保证安装的是最新的。

再在,pro02-maven-web当中查看:

mvn dependency:tree

效果还是和之前一样: 在这里插入图片描述

INFO] --------------------------------[ war ]---------------------------------
[INFO]
[INFO] --- maven-dependency-plugin:2.8:tree (default-cli) @ pro02-maven-web ---
[INFO] com.rainbowSea.maven:pro02-maven-web:war:1.0-SNAPSHOT
[INFO] +- junit:junit:jar:4.11:test
[INFO] |  \- org.hamcrest:hamcrest-core:jar:1.3:test
[INFO] +- javax.servlet:javax.servlet-api:jar:3.1.0:provided
[INFO] \- com.rainbowSea.maven:pro01-maven-java:jar:1.0-SNAPSHOT:compile
[INFO]    \- org.springframework:spring-core:jar:4.0.0.RELEASE:compile
[INFO]       \- commons-logging:commons-logging:jar:1.1.1:compile
[INFO] ------------------------------------------------------------------------

4. 最后:感谢

该文章参考了,如下博主的分享。我们再此,真诚的感谢博主的技术的热情的分享。

⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐感谢如下博主的分享 ⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐

【1】:兵器|代码重工

在这里插入图片描述