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小屋

欢迎关注个人公众号

maven 重复依赖不同版本 选择规则的更多相关文章

  1. java.util.zip.ZipException: duplicate entry(重复依赖多版本的类库)

    同步SVN仓库中的代码,更新后,运行项目,出现如下错误: com.android.build.api.transform.TransformException: java.util.zip.ZipEx ...

  2. maven exclusion 解决maven传递依赖中的版本冲突

    传递依赖是maven最有特色的.最为方便的优点之一,可以省了很多配置.如a 依赖 b,b 依赖c 默认 a也会依赖 c.但是也会带来隐患,如版本冲突.当然maven也考虑到解决办法,可以使用exclu ...

  3. maven 检查依赖冲突和版本冲突

    maven 检查依赖冲突和版本冲突   在项目发布的时候,一般都需要进行依赖冲突检查或者重复类的检查,这个时候我一般会使用下面的两个命令:   1 2 3 mvn -U clean package - ...

  4. Maven 3-Maven依赖版本冲突的分析及解决小结 (阿里,美团,京东面试)

    举例A依赖于B及C,而B又依赖于X.Y,而C依赖于X.M,则A除引B及C的依赖包下,还会引入X,Y,M的依赖包(一般情况下了,Maven可通过<scope>等若干种方式控制传递依赖).这里 ...

  5. maven命令/依赖/聚合

    一,编写pom.xml   首先我们看一下pom.xml   <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns ...

  6. maven入门(8)maven的依赖管理

    我们项目中用到的jar包可以通过依赖的方式引入,构建项目的时候从Maven仓库下载即可. 1. 依赖配置    依赖可以声明如下: <project> ... <dependenci ...

  7. maven项目依赖包问题

    问题 maven传递依赖 解决方案   前段时间,开发中遇到一个关于maven依赖包的问题:由于业务需要,支付网关对账代码中的slf4j-api包需要更新,原包为1.5.8版本,需要更新到1.6.4版 ...

  8. Maven快速入门(五)Maven的依赖管理

    前面我们讲了maven项目中的最重要的文件:pom.xml 配置文件相关内容.介绍了pom 是如何定义项目,如何添加依赖的jar 包的等. 我们知道,在Maven的生命周期中,存在编译.测试.运行等过 ...

  9. 理解Maven中的SNAPSHOT版本和正式版本

    Maven中建立的依赖管理方式基本已成为Java语言依赖管理的事实标准,Maven的替代者Gradle也基本沿用了Maven的依赖管理机制.在Maven依赖管理中,唯一标识一个依赖项是由该依赖项的三个 ...

随机推荐

  1. 使用three.js(webgl)搭建智慧楼宇、设备检测、数字孪生——第十三课

    老子云:有道无术,术尚可求,有术无道,止于术. 咱开篇引用老子的话术,也没其它意思,只是最近学习中忽有感悟,索性就写了上来. 这句话用现代辩证思维理解,这里的"道" 大抵是指方法论 ...

  2. 全局异常处理及参数校验-SpringBoot 2.7 实战基础 (建议收藏)

    优雅哥 SpringBoot 2.7 实战基础 - 08 - 全局异常处理及参数校验 前后端分离开发非常普遍,后端处理业务,为前端提供接口.服务中总会出现很多运行时异常和业务异常,本文主要讲解在 Sp ...

  3. MapReduce核心原理(下)

    MapReduce 中的排序 MapTask 和 ReduceTask 都会对数据按key进行排序.该操作是 Hadoop 的默认行为,任何应用程序不管需不需要都会被排序.默认排序是字典顺序排序,排序 ...

  4. 使用自定义隐式转换快速创建失败Result

    系统要求方法都返回 Result 结果,通常我们会如此定义一个 Result 1 public class Result<T> 2 { 3 public virtual int Code ...

  5. 技术管理进阶——技术Leader需要数据思维

    原创不易,求分享.求一键三连 假设我长得很漂亮,拥有众多追求者,但是初出闺房的我对这世界上的男人毫无认知,那么该如何选择呢?这真是一个问题! 妈妈说,愿意为我花钱的男人未必爱我,但不愿意为我花钱的男人 ...

  6. [CF1537E] Erase and Extend (字符串)

    题面 给一个长度为 n \tt n n 的字符串,你可以进行无限次以下两种操作之一: 删去末尾的字符(此时要保证删去后字符串非空). 把当前整个字符串复制一份,接到自己的后面. 输出最终通过操作能达到 ...

  7. Mybatis中多对一与一对多

    多对一的处理 在pojo中就有 Student private String name; private String id; private Teacher teacher; 比如说多个学生对应着一 ...

  8. B树-插入

    B树系列文章 1. B树-介绍 2. B树-查找 3. B树-插入 4. B树-删除 插入 根据B树的以下两个特性 每一个结点最多有m个子结点 有k个子结点的非叶子结点拥有 k − 1 个键 可以得出 ...

  9. 解决nuxt/koa架构初始项目运行报错问题

    今天在学习运用vue的nuxt/koa框架,初始化项目之后,在执行 $> npm run dev 时报错,错误详细信息如下: 点击查看报错的详细内容 > npm run dev Debug ...

  10. 不建议升级windows11的理由

    此文写于2022年9月13日,用于警告那些蠢蠢欲动想升级win11的伙伴. win11发布后,最亮眼的功能当然是自带"安卓模拟器",但作为一名程序开发者的我其实是不愿意马上尝鲜的, ...