Maven学习归纳(四)——传递依赖和依赖的规则

一、传递依赖

官方文档解释的传送门:http://ifeve.com/maven-dependency-mechanism/

当存在传递依赖的情况时,主工程对间接依赖的jar可以访问吗?

例如:A.jar依赖于B.jar,而B.jar依赖于C.jar,那么要怎么修改配置文件,才会让A.jar 也依赖 B.jar 呢?

这要看传递依赖的jar包引入时的依赖范围——只有依赖范围为compile时可以访问

即 要使A.jar 依赖于C.jar 当且仅当C.jar的范围是compile


如下演示HelloWrold2项目依赖 ——》HelloWrold项目依赖——》junit
此时HelloWrold这个项目是有junit.jar包的,而HelloWrold2是没有junit这个jar包的,如下所示:

需要在被依赖的项目HelloWorld的pom.xml上改写

改写之后,项目就出现了需要间接依赖的的jar包

 

二、依赖原则

依赖原则目的:防止jar包的冲突

为了避免造成依赖重复,需要选择一个依赖路径

1. 路径最短优先原则

存在两个项目依赖同个类型但不同版本的jar包,这个时候会优先选择路径短的

项目配置情况:

HelloWrold2 依赖 HelloWrold

HelloWrold   依赖  Junit3.8 jar

HelloWrold   依赖  Junit4.0 jar

从图中看,显然junit3.8距离HelloWrold2更近点的

既然都拥有junit这个包,那么原本是 3.8 的 HelloWrold2 再依赖了HelloWrold后,会发生什么情况呢??

配置如下:

运行结果如图所示:此时HelloWrold保持原来的junit-3.8.jar不变

2. 路径长度相同

路径长度相同的情况下,又可以分为是否有在同一个pom.xml两种情况

2.1 覆盖:

如果在同一pom.xml文件中有2个相同的依赖;后面声明的会覆盖前面的依赖

但这里要说严禁使用本情况,严禁在同一个pom中声明两个不同的依赖

2.2 优先:

如果是在不同pom.xml中有2个相同的依赖;则先声明的依赖,会覆盖后面生命的依赖

如下HelloWorld2依赖项目HelloWorld,和项目HelloWorld3

HelloWorld与HelloWorld3都有不同版本的commons-fileupload.jar

显然,先写在前面的HelloWorld3的jar包被采用了

 

简单的依赖就完了呢~ o(* ̄▽ ̄*)o

posted @ 2018-08-27 15:32  条条的是道  阅读(10839)  评论(4编辑  收藏  举报