一、依赖的传递性
好处:可以传递的依赖(compile范围)不必在每个模块工程中都重复声明,在“最下面”的工程中依赖一次即可
注意:非compile范围的依赖不能传递。所以在各个工程模块中,如果有需要就得重复声明依赖。
二、依赖原则
- 一个工程(可以打成一个jar包或者war的模块)下,只会依赖某个jar包的一个版本,包括依赖传递过来的jar包(也会转化成其中的某一个版本)。
- 如果是打成war包,我们可以从war包的lib文件夹里看到,同一个jar包只依赖一个版本。
- 如果是打成jar包,该jar包所依赖的其它jar包是不打到这个jar包里面的。
- 解决模块工程之间的jar包冲突问题,maven根据自己的内置原则自动处理冲突。
- 加载哪个版本jar包的原则
- 路径最短者优先原则
- 先声明者优先:dependency标签的声明顺序
三、依赖排除
- 一个工程依赖某个jar包,可以排除这个jar包依赖的某些jar包,但是并不是说这个工程不需要这个jar包了,而且在其它地方已经依赖了,或者依赖了可以替代的jar包
- 依赖排除的设置方式
<dependency>
<groupId>xin.yangshuai.maven</groupId>
<artifactId>HelloFriend</artifactId>
<version>0.0.1-SNAPSHOT</version>
<scope>compile</scope>
<exclusions>
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
四、举例
4.1 路径最短者优先原则
- 依赖顺序:SecondTest,ThirdTest,FirstTest:2.0
- 最终依赖的FirstTest版本:WebTest工程一共引入了3个FirstTest jar包,距离最近的是FirstTest:2.0,所以WebTest工程依赖的是FirstTest:2.0
- 注意:此时WebTest工程依赖的是FirstTest:2.0,war的lib文件夹下也是FirstTest:2.0,FirstTest:1.0并没有打到war包里面,所以在这个工程里面,SecondTest也变成依赖FirstTest:2.0了
4.2 先声明者优先:dependency标签的声明顺序
- 依赖顺序:SecondTest,ThirdTest
- 最终依赖的FirstTest版本:WebTest工程一共引入了2个FirstTest jar包,距离相同,FirstTest:1.0先声明,所以WebTest工程依赖的是FirstTest:1.0
- 注意:此时WebTest工程依赖的是FirstTest:1.0,war的lib文件夹下也是FirstTest:1.0,FirstTest:2.0并没有打到war包里面,所以在这个工程里面,ThirdTest也变成依赖FirstTest:1.0了
简单的测试工程,可以测试上面所说的内容:https://gitee.com/shuair/testMaven.git