乐趣区

关于java:maven-重复依赖不同版本-选择规则

maven 反复依赖不同版本 抉择规定

本篇次要来看看 maven 对于 反复依赖的 jar 的不同版本时候 它外部的抉择规定, 很多时候咱们在搭建环境的时候 不留神就会存在依赖抵触等问题 那依赖抵触的时候 为什么 maven 抉择了不是你如你所想的 jar 版本呢 , 其实都是有肯定规定的 上面来看看吧

1. 前言

咱们在应用 maven 的时候 多多少少遇到过 jar 包抵触的问题, 在对一个 jar 包引入不同版本后, 可能会导致 NoSuchMethodError 谬误, 那么你真的分明 maven 在多个版本 jar 的时候是怎么去抉择版本的呢? 如果了解这些 在加上一些依赖抵触辅助工具, 能够让你更加疾速的解决这类问题

2. 反复依赖抉择准则

先把反复依赖后 抉择准则抛出来 待会一个个进行验证

  • 最短门路准则: 两级以上的不同级依赖, 抉择门路最短
  • 申明优先准则 : 两级以上的同级依赖, 先申明的笼罩后申明的
  • 同级依赖后加载笼罩先加载准则

3. 前置筹备

  • 创立 web , service , common 模块
  • 应用 elasticsearch-rest-high-level-client 和 elasticsearch-rest-client 配合 演示

4. 最短门路准则

最短门路准则的前提是 两级以上的不同级依赖, 抉择门路最短

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 模块中的下 就示意这个抵触了 不应用它

4.4 mvn dependency:tree

能够通过 mvn dependency:tree 去查看 我的项目的依赖树 , 能够看到 最短门路准则 失效了, maven 抉择了短门路的 service 模块的 elasticsearch-rest-client:6.8.13 版本

5. 申明优先准则

申明优先准则: 前提是 两级以上的同级依赖, 先申明的笼罩后申明的

把下面的依赖构造改一下

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 中的依赖

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 中的依赖

至此申明优先准则 验证结束

6. 同级依赖后加载 笼罩 先加载准则

将依赖改成如下

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

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

7. idea 插件 maven helper

最初 举荐一款 idea 中 能够剖析疾速解决 maven 依赖抵触的 插件 maven helper

上面依赖标注的 6.8.13 也示意了 以后 maven 抉择的 jar 版本

总结

本篇十分具体了介绍了 maven 中当有反复依赖不同版本 jar 的时候 maven 抉择 jar 的 几个规定, 并且都一一做了 验证, 你学会了吗, maven 平时咱们都是只是 复制粘贴用一用 然而当你遇到问题的时候 须要疾速解决它的能力, 加油吧!

欢送大家拜访 集体博客 Johnny 小屋
欢送关注集体公众号

退出移动版