maven 重复依赖不同版本 选择规则

本篇主要来看看 maven 对于 重复依赖的jar的不同版本时候 它内部的选择规则, 很多时候我们在搭建环境的时候 不注意就会存在依赖冲突等问题 那依赖冲突的时候 为什么maven选择了不是你如你所想的jar 版本呢 , 其实都是有一定规则的 下面来看看吧

1.前言

我们在使用maven 的时候 多多少少遇到过jar包冲突的问题, 在对一个jar包引入不同版本后,可能会导致NoSuchMethodError 错误, 那么你真的清楚 maven 在多个版本jar的时候是怎么去选择版本的呢? 如果理解这些 在加上一些依赖冲突辅助工具,可以让你更加快速的解决这类问题

2.重复依赖选择原则

先把重复依赖后 选择原则抛出来 待会一个个进行验证

3.前置准备

4.最短路径原则

最短路径原则的前提是 两级以上的不同级依赖, 选择路径最短

maven 重复依赖不同版本 选择规则

4.1 common 模块

common 模块中引入了 elasticsearch-rest-high-level-client 7.4.2 而它依赖了 elasticsearch-rest-client 7.4.2

common pom:

    <dependencies>
        <dependency>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>elasticsearch-rest-high-level-client</artifactId>
            <version>7.4.2</version>
        </dependency>
    </dependencies>

4.2 service 模块

service 模块中 直接引入了 elasticsearch-rest-client 6.8.13

service pom:

    <dependencies>
        <dependency>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>elasticsearch-rest-client</artifactId>
            <version>6.8.13</version>
        </dependency>
    </dependencies>

4.3 idea maven 分析工具

打开idea 的maven 部分可以看到 已经提示我们 有依赖冲突了, 其实它标注在 common模块中的下 就表示这个冲突了 不使用它

maven 重复依赖不同版本 选择规则

4.4 mvn dependency:tree

可以通过 mvn dependency:tree 去查看 项目的依赖树 , 可以看到 最短路径原则 生效了, maven 选择了短路径的 service模块的 elasticsearch-rest-client:6.8.13 版本

maven 重复依赖不同版本 选择规则

5.声明优先原则

声明优先原则: 前提是 两级以上的同级依赖, 先声明的覆盖后声明的

把上面的依赖结构改一下

maven 重复依赖不同版本 选择规则

5.1 common 模块

让common 模块直接依赖 elasticsearch-rest-client 7.4.2

    <dependencies>
        <dependency>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>elasticsearch-rest-client</artifactId>
            <version>7.4.2</version>
        </dependency>
    </dependencies>

5.2 service 模块

    <dependencies>
        <dependency>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>elasticsearch-rest-client</artifactId>
            <version>6.8.13</version>
        </dependency>
    </dependencies>

5.3 验证 web 模块 (common 在 service 前)

    <dependencies>
        <dependency>
            <groupId>org.example</groupId>
            <artifactId>backend_common</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>org.example</groupId>
            <artifactId>backend_service</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
    </dependencies>

记得需要重新打包模块 mvn clean install

由于 依赖顺序 common 在 service 之前 选择了 common 中的依赖

maven 重复依赖不同版本 选择规则

5.4 验证 web 模块 (service 在 common 前)

    <dependencies>
         <dependency>
            <groupId>org.example</groupId>
            <artifactId>backend_service</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>org.example</groupId>
            <artifactId>backend_common</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
    </dependencies>

记得需要重新打包模块 mvn clean install

由于 依赖顺序 service 在 common 之前 选择了 service 中的依赖

maven 重复依赖不同版本 选择规则

至此声明优先原则 验证完毕

6.同级依赖后加载 覆盖 先加载原则

将依赖改成如下

maven 重复依赖不同版本 选择规则

6.1 web 模块

在web 的pom 中 直接引入2个 版本的依赖

6.2 验证 web模块(client 7.4.2 在 client 6.8.13 前)

    <dependencies>
        <dependency>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>elasticsearch-rest-client</artifactId>
            <version>7.4.2</version>
        </dependency>
        <dependency>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>elasticsearch-rest-client</artifactId>
            <version>6.8.13</version>
        </dependency>
    </dependencies>

记得需要重新打包模块 mvn clean install

maven 重复依赖不同版本 选择规则

6.3 验证 web模块(client 6.8.13 在 client 7.4.2 前)

    <dependencies>
        <dependency>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>elasticsearch-rest-client</artifactId>
            <version>6.8.13</version>
        </dependency>
        <dependency>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>elasticsearch-rest-client</artifactId>
            <version>7.4.2</version>
        </dependency>
    </dependencies>

记得需要重新打包模块 mvn clean install

maven 重复依赖不同版本 选择规则

7. idea 插件 maven helper

最后 推荐一款 idea 中 可以分析快速解决 maven 依赖冲突的 插件 maven helper

maven 重复依赖不同版本 选择规则

下面依赖标注的 6.8.13 也表示了 当前maven 选择的 jar 版本

maven 重复依赖不同版本 选择规则

总结

本篇非常详细了介绍了 maven 中当有重复依赖不同版本jar 的时候 maven 选择jar的 几个规则,并且都一一做了 验证, 你学会了吗, maven 平时我们都是只是 复制粘贴用一用 但是当你遇到问题的时候 需要快速解决它的能力,加油吧!

欢迎大家访问 个人博客 Johnny小屋
欢迎关注个人公众号

maven 重复依赖不同版本 选择规则