目录
一、依赖的传递性
- 好处:可以传递的依赖(compile范围)不必在每个模块工程中都重复声明,在“最下面”的工程中依赖一次即可。可参考:maven依赖范围
- 注意:非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>
四、举例
- 路径最短者优先原则
- 依赖顺序: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了
- 先声明者优先: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
五、Tips
-
如有不对的地方还请告知,感激不尽