侧边栏壁纸
  • 累计撰写 2,058 篇文章
  • 累计创建 73 个标签
  • 累计收到 20 条评论

目 录CONTENT

文章目录

maven依赖的传递性

大猿本猿
2021-11-28 / 523 阅读 / 0 字

image

一、依赖的传递性

好处:可以传递的依赖(compile范围)不必在每个模块工程中都重复声明,在“最下面”的工程中依赖一次即可

注意:非compile范围的依赖不能传递。所以在各个工程模块中,如果有需要就得重复声明依赖。

二、依赖原则

  1. 一个工程(可以打成一个jar包或者war的模块)下,只会依赖某个jar包的一个版本,包括依赖传递过来的jar包(也会转化成其中的某一个版本)。
  2. 如果是打成war包,我们可以从war包的lib文件夹里看到,同一个jar包只依赖一个版本。
  3. 如果是打成jar包,该jar包所依赖的其它jar包是不打到这个jar包里面的。
  4. 解决模块工程之间的jar包冲突问题,maven根据自己的内置原则自动处理冲突。
  5. 加载哪个版本jar包的原则
  6. 路径最短者优先原则
  7. 先声明者优先: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 路径最短者优先原则

image

  1. 依赖顺序:SecondTest,ThirdTest,FirstTest:2.0
  2. 最终依赖的FirstTest版本:WebTest工程一共引入了3个FirstTest jar包,距离最近的是FirstTest:2.0,所以WebTest工程依赖的是FirstTest:2.0
  3. 注意:此时WebTest工程依赖的是FirstTest:2.0,war的lib文件夹下也是FirstTest:2.0,FirstTest:1.0并没有打到war包里面,所以在这个工程里面,SecondTest也变成依赖FirstTest:2.0了

4.2 先声明者优先:dependency标签的声明顺序

image

  1. 依赖顺序:SecondTest,ThirdTest
  2. 最终依赖的FirstTest版本:WebTest工程一共引入了2个FirstTest jar包,距离相同,FirstTest:1.0先声明,所以WebTest工程依赖的是FirstTest:1.0
  3. 注意:此时WebTest工程依赖的是FirstTest:1.0,war的lib文件夹下也是FirstTest:1.0,FirstTest:2.0并没有打到war包里面,所以在这个工程里面,ThirdTest也变成依赖FirstTest:1.0了

简单的测试工程,可以测试上面所说的内容:https://gitee.com/shuair/testMaven.git