maven的依赖传递

153 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第1天,点击查看活动详情

1.什么是传递依赖

A依赖B,B依赖C,在A没有配置对C的依赖的情况下,A能直接使用C,这就是传递依赖

2.传递依赖的原则

在A依赖B,B依赖C的前提下,C能否传递到A是有条件的,这个条件是B依赖于C时所确定的依赖范围

  • B依赖于C的时候,如果依赖范围是compile了,那么A依赖于B时,A是可以使用C的。
  • B依赖于C的时候,如果依赖范围是test或者provided,那么A依赖于B时,A是无法使用C的。如果A确实需要C的话,那么需要A直接去依赖C。

3.验证

  1. 我们创建一个项目,项目叫pro01-maven-java(这个项目叫什么无所谓,这个项目现在相当于A
  2. 为pro01-maven-java项目导入spring-core依赖。spring-core相当于B
<!--以 compile 范围导入 spring-core 依赖,测试依赖的传递性-->
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-core</artifactId>
  <version>4.0.9.RELEASE</version>
</dependency>

3.在idea里面查看依赖情况。你会发现commons-logging(相当于C)被引入pro01-maven-java。也就是说pro01-maven-java可以使用commons-logging

image.png

在前面,我们说过A依赖B,B依赖C。如果A想通过B依赖C的话,那么取决于B对C的依赖范围。根据上面的结果,我们发现pro01-maven-java没有直接依赖commons-logging,却有了commons-logging。我们现在打开本地仓库的spring-core,查看spring-core的pom文件内容。内容如下:

<dependency>
      <groupId>commons-logging</groupId>
      <artifactId>commons-logging</artifactId>
      <version>1.1.3</version>
      <scope>compile</scope>
</dependency>

发现spring-core对commons-logging的依赖范围是compile