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

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

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

1.前言

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

2.重复依赖选择原则

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

  • 最短路径原则: 两级以上的不同级依赖, 选择路径最短
  • 声明优先原则 : 两级以上的同级依赖,先声明的覆盖后声明的
  • 同级依赖后加载覆盖先加载原则

3.前置准备

  • 创建 web , service , common 模块
    maven 重复依赖不同版本 选择规则

4.最短路径原则

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

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

4.1 common 模块

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

common pom:


            org.elasticsearch.client
            elasticsearch-rest-high-level-client
            7.4.2

4.2 service 模块

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

service pom:


            org.elasticsearch.client
            elasticsearch-rest-client
            6.8.13

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


            org.elasticsearch.client
            elasticsearch-rest-client
            7.4.2

5.2 service 模块


            org.elasticsearch.client
            elasticsearch-rest-client
            6.8.13

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


            org.example
            backend_common
            1.0-SNAPSHOT

            org.example
            backend_service
            1.0-SNAPSHOT

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

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

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

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


            org.example
            backend_service
            1.0-SNAPSHOT

            org.example
            backend_common
            1.0-SNAPSHOT

记得需要重新打包模块 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 前)


            org.elasticsearch.client
            elasticsearch-rest-client
            7.4.2

            org.elasticsearch.client
            elasticsearch-rest-client
            6.8.13

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

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

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


            org.elasticsearch.client
            elasticsearch-rest-client
            6.8.13

            org.elasticsearch.client
            elasticsearch-rest-client
            7.4.2

记得需要重新打包模块 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 重复依赖不同版本 选择规则

Original: https://www.cnblogs.com/askajohnny/p/16827108.html
Author: AskaJohnny
Title: maven 重复依赖不同版本 选择规则

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/684472/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 2022年1-2月全球技术标准更新

    2021 年11 月12 日,欧亚经济委员会(EEC )的理事会发布了第130 号决定,主题为”在欧亚经济联盟关税区内进行强制性合格评定的产品进口到欧亚经济联盟关税区的…

    技术杂谈 2023年6月21日
    091
  • 读《软件测试的艺术》——第一章

    《软件测试的艺术》作为元老级别的测试理论书籍,在业内非常经典且有口皆碑,书中提出的 软件测试为求错而非求证的观点至今仍在学术界被广泛讨论。本书还为计算机界一个最为重要的主题提供了一…

    技术杂谈 2023年7月11日
    058
  • dremio 的一些系统表

    dremio 的一些系统表是比较有用的,比如进行系统反射以及node 信息的查看,同时也便于系统的监控(同时我们也可以基于prometheus 处理) 查询命令 SELECT * …

    技术杂谈 2023年5月30日
    0110
  • 设计模式-责任链模式

    将各个功能拆分后分别封装(各功能解耦),需要时可 自由组合(包括执行顺序) 话不多说,看个优化案例吧。 优化案例 以下是模拟客户端想服务端发送请求的业务流程。 客户端调用代码如下。…

    技术杂谈 2023年7月11日
    064
  • MAC Golang环境搭建

    下载golang 下载地址:https://golang.google.cn/dl/ 根据MAC左上角苹果图标->关于本机,即可查看芯片类型 安装golang 在 下载 中双…

    技术杂谈 2023年6月21日
    072
  • 动态ip、静态ip、pppoe拨号的区别

    pppoe拨号 pppoe拨号上网,又叫做ADSL拨号上网、宽带拨号上网。指现在有很多我的E家用户,送的无线猫,阉割了PPPOE拨号功能,必须要从电脑上拨号才能上网。还有大街上的W…

    技术杂谈 2023年5月31日
    0102
  • 浅谈在线文档的那些事儿

    前言 对前端来说开发一个在线文档需要啥技术呢?想一下,开发一个在线文档我们可能要解决的问题: 最基础的文本编辑功能(哦?好像textarea就可以完成,那如果是富文本呢?)我们需要…

    技术杂谈 2023年5月31日
    073
  • Malformed UTF-8 characters, possibly incorrectly encoded

    PHP 报错: [ error ] [0]Malformed UTF-8 characters, possibly incorrectly encoded 原因:返回的内容用 UT…

    技术杂谈 2023年5月31日
    075
  • 安装VMware Tools显示灰色的解决办法

    用VMware Workstation Pro好几年了,期间这个问题也遇到过好几次,这次把解决方案记录一下,若后续有其他情况其他解决方案将在此博文更新。 Step1:关闭虚拟机; …

    技术杂谈 2023年7月11日
    0124
  • Docker简介与安装

    Docker简介与安装 Docker overview | Docker Documentation 官方文档 1.Docker简介 Docker是一个用于开发、发布和运行应用程序…

    技术杂谈 2023年7月10日
    093
  • tcpip详解-读书笔记

    TCP/IP详解 卷一 第一版读书笔记 第一章: 应用层关心是应用程序的细节,而不是数据在网络中对的传输活动,下三层对应用程序一无所知,但他们要处理所有的通信细节。 七层代理可以根…

    技术杂谈 2023年7月11日
    0117
  • MySQL数据库-数据表(一)

    数据表的基本操作. MySQL 数据库支持多种数据类型,大致可以分为 3 类:数值类型、日期和时间类型、字符串(字符)类型。 (1)数值类型 数值类型用于存储数字型数据,这些类型包…

    技术杂谈 2023年6月21日
    0100
  • Jupyter Notebook 对虚拟环境的访问

    本文写作时间:2021 年 5 月 Jupyter Notebook 默认并不支持 Conda,无法访问虚拟环境中的资源,自然也无法切换不同的虚拟环境运行笔记。通过插件 nb_co…

    技术杂谈 2023年7月11日
    070
  • PyQt5 qss样式

    ################################ PyQt5中文网 – PyQt5全套视频教程 # https://www.PyQt5.cn/ # 主讲: 村长 #…

    技术杂谈 2023年5月31日
    072
  • Java复习,Java知识点以及Java面试题(二)

    面向对象:封装,继承,多态 类:相关属性和行为的集合。 对象:该类的具体体现 成员变量和局部变量的区别: 位置:成员变量在类中方法外;局部变量在方法定义中或者方法声明上。 内存中的…

    技术杂谈 2023年6月21日
    077
  • yuv rgb 互转 公式 及算法

    1 前言 自然界的颜色千变万化,为了给颜色一个量化的衡量标准,就需要建立色彩空间模型来描述各种各样的颜色,由于人对色彩的感知是一个复杂的生理和心理联合作用的过程,所以在不同的应用领…

    技术杂谈 2023年5月31日
    089
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球