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

什么是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

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容