maven依赖管理
1.依赖范围 (依赖相当于java中的import 是否需要导入别的jar包)
使用控制依赖与三种classpath(编译期,测试时期,运行时期)的关系
complie 在编译,测试,运行时期,a项目在编译期依赖b,并且在测试和运行时期也依赖b项目, (默认值) 会打jar包或者war包
test 只在测试时有效, a项目只在测试时依赖b项目, 不会打jwar包
provided 在编译和测试是有效,在运行时不会打jar或war包
runtime 会在测试时和运行时进行打包处理,(会打war包)
2.依赖传递
a----->b 第一关系:a依赖b compile
b----->c 第二关系:b依赖c complie
1.纵坐标, 直接依赖
a---->b a依赖b 那么b就是a的直接依赖
在a的pom.xml中添加b的坐标
2横坐标, 传递依赖
b----->c b依赖c 那么c就是a的传递依赖
3.中间依赖
传递依赖的范围 a依赖c的范围
3.依赖调节原则
情景再现: 项目 A 依赖于项目 B,项目 B 依赖于项目 C(v1), 项目 A 依赖于项目 D,项目 D 依赖于项目 E,项目 E 依赖于 C(v2), 1、A--->B---->C(v1) , 2、A------>D---->E----->C(v2) 项目 A 隐形依赖了两个版本的 C,那到底采用哪个版本呢?
依赖调节第一原则: 路径优先
很明显,第一种路径深度是 3,第二种路径深度是 4,所以,maven 会采用 C(v1)
依赖调节第二原则: 声明优先
假设路径深度相等,那么声明在前的会被引用。
4.版本锁定
在Maven中dependencyManagement的作用其实相当于一个对所依赖jar包进行版本管理的管理器。 pom.xml 文件中,jar 的版本判断的两种途径 1. 如果 dependencies 里的 dependency 自己没有声明 version 元素,那么 maven 就会倒 dependencyManagement 里面去找有没有对该 artifactId 和 groupId 进行过 版本声明,如果有,就继承它,如果没有就会报错,告诉你必须为 dependency 声明一个 version。 2. 如果 dependencies 中 的 dependency 声 明 了 version , 那 么 无 论 dependencyManagement 中有无对该 jar 的 version 声明,都以 dependency 里的 version 为准。
5.排除依赖
我们仔细观察 Maven Dependencies 下的 jar 包,会发现存在了两个 javassist 包,一个是 javassist-3.18.1-GA. ,另一个是 javassist-3.11.0-GA 。这是因为我 们引入三大框架的 jar 包,hibernate 依赖 javassist-3.18.1-GA ,而 struts 依赖 javassist-3.11.0-GA 。这就是我们通常所说的 jar 包版本冲突,如果这两个 jar 包 同时存在,会导致后续某些操作会存在问题(比如 openSessionInView 失效), 所以需要排除低版本的 jar 包。 如何来排除依赖呢?添加下面红色字体的部分。作用是排除 struts 中依赖的 javassist 的 jar
<dependency> <groupId>org.apache.struts</groupId> <artifactId>struts2-core</artifactId> <version>2.3.24</version> <exclusions> <exclusion> <groupId>javassist</groupId> <artifactId>javassist</artifactId> </exclusion> </exclusions> </dependency>
添加后发现 javassist-3.11.0-GA 消失。