之前说过了可以通过依赖的方式将一个大程序分为多个小的模块,模块之间可以利用依赖链接在一起。
但是如果有多个依赖的情况下会怎么样呢?
A依赖于B、C,而B、C又有各自的依赖,那么A是否依赖于B、C的依赖呢?
答案是是的,因为具有依赖传递的特性。
那么如果传递依赖中出现了包版本依赖冲突的问题,算那个包呢?
情况一:特殊优先:在一个pom.xml中添加两个不同版本的Junit依赖:后配置的覆盖先配置的。
情况二:路径优先:当依赖中出现相同的资源时,层级越深,优先级越低,层级越浅,优先级越高。
- A通过B间接依赖到E1、通过C间接依赖到E2,A就会间接依赖到E1和E2,Maven会按照层级来选择,E1是2度,E2是3度,所以最终会选择E1。
情况三:声明优先:当资源在相同层级被依赖时,配置顺序靠前的覆盖配置顺序靠后的。
- A通过B间接依赖到D1、通过C间接依赖到D2,D1和D2都是两度,这个时候就不能按照层级来选择,需要按照声明来,谁先声明用谁,也就是说B在C之前声明,这个时候使用的是D1,反之则为D2。
如果想更全面的查看Maven中各个坐标的依赖关系,可以点击Maven面板中的show Dependencies
如果出于某些原因,我不想使用传递依赖下的某个包,怎么办呢?
方法一:可选依赖
- 可选依赖指对外隐藏当前所依赖的资源—不透明
<dependency>
<groupId>com.itheima</groupId>
<artifactId>maven_03_pojo</artifactId>
<version>1.0-SNAPSHOT</version>
<!--可选依赖是隐藏当前工程所依赖的资源,隐藏后对应资源将不具有依赖传递-->
<optional>true</optional>
</dependency>
方法二:排除依赖
- 排除依赖指主动断开依赖的资源,被排除的资源无需指定版本
<dependency>
<groupId>com.itheima</groupId>
<artifactId>maven_04_dao</artifactId>
<version>1.0-SNAPSHOT</version>
<!--排除依赖是隐藏当前资源对应的依赖关系-->
<exclusions>
<exclusion>
<groupId>com.itheima</groupId>
<artifactId>maven_03_pojo</artifactId>
</exclusion>
</exclusions>
</dependency>