项目管理工具——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】,如图:
项目管理工具——Maven学习笔记(十一、Maven依赖冲突)_第1张图片
Paste_Image.png
  1. 点击红框的Item,进入详情:

项目管理工具——Maven学习笔记(十一、Maven依赖冲突)_第2张图片
Paste_Image.png

好多版本啊,既然我们要实验版本冲突,那么我这次就使用2.5和1.4吧~
2.5版本的依赖:


    commons-io
    commons-io
    2.5

1.4版本的依赖:


    commons-io
    commons-io
    1.4


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

项目管理工具——Maven学习笔记(十一、Maven依赖冲突)_第3张图片
Paste_Image.png
项目管理工具——Maven学习笔记(十一、Maven依赖冲突)_第4张图片
Paste_Image.png
项目管理工具——Maven学习笔记(十一、Maven依赖冲突)_第5张图片
Paste_Image.png

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

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

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

    
            com.amber.maventest
            maventest-c
            0.0.1-SNAPSHOT
        

        
            com.amber.maventest
            maventest-b
            0.0.1-SNAPSHOT
        
        
项目管理工具——Maven学习笔记(十一、Maven依赖冲突)_第6张图片
Paste_Image.png

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

你可能感兴趣的:(项目管理工具——Maven学习笔记(十一、Maven依赖冲突))