美文网首页maven
项目管理工具——Maven学习笔记(十一、Maven依赖冲突)

项目管理工具——Maven学习笔记(十一、Maven依赖冲突)

作者: 鲁克巴克诗 | 来源:发表于2017-05-18 18:54 被阅读23次

什么是Maven的依赖冲突呢?
举个例子,假如A和B都依赖了一个C,但这个C是不同版本的。这时,D又要依赖A和B,那么C就是D的传递依赖了。但是因为C有两个不同的版本,不知道该选哪个,D表示很苦恼。——这就是依赖冲突了。

遇到依赖冲突,我们有两条原则:
一、 短路优先(优先解析传递路径短的版本)。
例如:

第一条依赖路径:A → B → C → X(jar)
第二条依赖路径:A → D →X(jar)
因为第二条依赖路径相对来说最短,所以A会依赖第二条路径X的版本。

为了更加清楚的解释这一点,接下来我会在Eclipse中做实验:

  1. 首先打开百宝箱,找到【commons-io】,如图:
Paste_Image.png
  1. 点击红框的Item,进入详情:
Paste_Image.png
好多版本啊,既然我们要实验版本冲突,那么我这次就使用2.5和1.4吧~
2.5版本的依赖:
<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.5</version>
</dependency>

1.4版本的依赖:

<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>1.4</version>
</dependency>

到此呢,先不要急着往下走,现在回想一下上篇的内容,想不起来戳→Maven传递依赖
上篇我们讲:A依赖B ,B依赖C,那么A和C时传递依赖关系。
现在我们增加一点复杂性,以完成依赖冲突这个课题。现在让C依赖【commons-io的1.4版本】,让B依赖【commons-io的2.5版本】,看A最终会依赖哪个版本呢?

Paste_Image.png Paste_Image.png Paste_Image.png

如上所述,短路优先这个原则是正确的。

二、 先声明先优先(如果依赖路径长度相同,则谁先声明,先解析谁)。
为了验证这个结论,还需要再次更改我们项目。现在我们改成:A同时直接依赖B和C。

A的pom.xml内容,注意顺序哦,C在B前边声明:

    <dependency>
            <groupId>com.amber.maventest</groupId>
            <artifactId>maventest-c</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>

        <dependency>
            <groupId>com.amber.maventest</groupId>
            <artifactId>maventest-b</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        
        </dependency>
Paste_Image.png

以后遇到此类问题,就知道为什么了吧~

相关文章

网友评论

    本文标题:项目管理工具——Maven学习笔记(十一、Maven依赖冲突)

    本文链接:https://www.haomeiwen.com/subject/kgosxxtx.html