一、传递依赖

官方文档解释的传送门:http://ifeve.com/maven-dependency-mechanism/
当存在传递依赖的情况时,主工程对间接依赖的jar可以访问吗?
例如:A.jar依赖于B.jar,而B.jar依赖于C.jar,那么要怎么修改配置文件,才会让A.jar 也依赖 C.jar 呢?
这要看传递依赖的jar包引入时的依赖范围——只有依赖范围为compile时可以访问
即 要使A.jar 依赖于C.jar 当且仅当C.jar的范围是compile
4,传递依赖和依赖的规则 - 图1
如下演示HelloWrold2项目依赖 ——》HelloWrold项目依赖——》junit
此时HelloWrold这个项目是有junit.jar包的,而HelloWrold2是没有junit这个jar包的,如下所示:
4,传递依赖和依赖的规则 - 图2
需要在被依赖的项目HelloWorld的pom.xml上改写
4,传递依赖和依赖的规则 - 图3
改写之后,项目就出现了需要间接依赖的的jar包
4,传递依赖和依赖的规则 - 图4

二、依赖原则

依赖原则目的:防止jar包的冲突
为了避免造成依赖重复,需要选择一个依赖路径

1. 路径最短优先原则_

存在两个项目依赖同个类型但不同版本的jar包,这个时候会优先选择路径短的
项目配置情况:
HelloWrold2 依赖 HelloWrold
HelloWrold 依赖 Junit3.8 jar
HelloWrold 依赖 Junit4.0 jar
从图中看,显然junit3.8距离HelloWrold2更近点的
既然都拥有junit这个包,那么原本是 3.8 的 HelloWrold2 再依赖了HelloWrold后,会发生什么情况呢??
4,传递依赖和依赖的规则 - 图5
配置如下:
4,传递依赖和依赖的规则 - 图6
运行结果如图所示:此时HelloWrold保持原来的junit-3.8.jar不变
4,传递依赖和依赖的规则 - 图7

2. 路径长度相同

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

2.1 覆盖:

如果在同一pom.xml文件中有2个相同的依赖;后面声明的会覆盖前面的依赖
但这里要说严禁使用本情况,严禁在同一个pom中声明两个不同的依赖

4,传递依赖和依赖的规则 - 图8

2.2 优先:

如果是在不同pom.xml中有2个相同的依赖;则先声明的依赖,会覆盖后面生命的依赖
如下HelloWorld2依赖项目HelloWorld,和项目HelloWorld3
HelloWorld与HelloWorld3都有不同版本的commons-fileupload.jar
显然,先写在前面的HelloWorld3的jar包被采用了
4,传递依赖和依赖的规则 - 图9

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