首页 > 其他分享 >maven 重复依赖不同版本 选择规则

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

时间:2022-10-26 09:11:50浏览次数:82  
标签:依赖 模块 rest maven client elasticsearch 版本

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 配合 演示

    image-20221025151502857

4.最短路径原则

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

image-20221025154328799

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模块中的下 就表示这个冲突了 不使用它

image-20221025152057576

4.4 mvn dependency:tree

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

image-20221025152506714

5.声明优先原则

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

把上面的依赖结构改一下

image-20221025154359655

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

image-20221025153845751

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

image-20221025154129495

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

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

将依赖改成如下

image-20221025154440302

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

image-20221025154741418

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

image-20221025154957696

7. idea 插件 maven helper

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

image-20221025155159667

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

image-20221025155429247

总结

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

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

欢迎关注个人公众号

标签:依赖,模块,rest,maven,client,elasticsearch,版本
From: https://www.cnblogs.com/askajohnny/p/16827108.html

相关文章

  • Linux安装多个CUDA版本可切换
    参考https://blog.csdn.net/tangjiahao10/article/details/125228143服务器的cuda版本比较老,需要更新,但很多人用的都是老版本cuda的代码,所以装个可切换的新版本。注意到1......
  • Http的基本概念和maven的学习
    1:什么是HTTP(1)HTTP(超本文传输协议)是一个简单的请求-响应协议(2)HTTP的默认端口是80,HTTPS是443(安全的)2:http的两个时代(1)http1.0:客户端可以与web服务器链接后,......
  • vue 与 脚手架版本
    vue与cli版本怎么选择卸载npmuninstall[<@scope>/]<pkg>[@<version>]...[--save-prod|--save-dev|--save-optional][--no-save]点击查看代码npmuninstallvue......
  • Git 工作区、暂存区和版本库
     Git工作区、暂存区和版本库基本概念我们先来理解下Git工作区、暂存区和版本库概念:工作区:就是你在电脑里能看到的目录。暂存区:英文叫stage或index。一般存放......
  • linux 多个php版本切换环境默认版本
    原版本为php7.2.18#找到php的位置whereisphp#删除默认版本rm-rf/usr/bin/php#创建软连接ln-sf/usr/local/php74/bin/php/usr/bin/php#查看php-v ......
  • IOS 15提示“此App的开发者需要更新APP以在此IOS版本上正常工作”解决办法
    参考:https://baijiahao.baidu.com/s?id=1702628997796836559&wfr=spider&for=pc随着iOS隐私协议更新以及iOS14.6系统正式放开,很多已经安装的app在升级到iOS14.6或者iOS15......
  • git 版本回退
    git回退到指定版本步骤:把你想回退的版本的commitid和最新版本的commitid记下来然后用命令gitreset--hard老版本的commitid再gitreset--mix最新版本的commit......
  • 通过Nvm修改node版本
     之前用的node版本是16.16.0,可能是node版本太高了,搞定不了两年前的项目,只能用和插件适应的14.版本。   先说一下大体的思路:  1、卸载原本的nodejs  2、......
  • 积木报表—JimuReport v1.5.4版本发布,免费的可视化Web报表工具
    项目介绍一款免费的低代码可视化报表,像搭建积木一样在线拖拽设计!低代码开发必备,功能涵盖,数据报表、打印设计、图表报表、大屏设计等!秉承“简单、易用、专业”的产品理念......
  • istio部署demoapp多版本应用示例
    环境说明frontend(proxy):前端应用,会请求后端的demoappservice:proxydemoapp:后端应用同时部署两个版本 部署demoappv1.0deploy-demoapp-v10.yamla......