maven依赖管理

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 消失。

原文地址:https://www.cnblogs.com/fjkgrbk/p/dependencyManagement.html