实际上手体验maven面对冲突Jar包的加载规则 | 京东云技术团队

这篇具有很好参考价值的文章主要介绍了实际上手体验maven面对冲突Jar包的加载规则 | 京东云技术团队。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、问题背景

相信大家在日常的开发过程中都遇到过Jar包冲突的问题,emm,在最近处理业务需求时我也遇到了不同版本jar包冲突导致项目加载出错的问题。主要是一个完整的项目会不可避免的使用第三方的Jar包来实现功能开发,各种第三方包之间可能会存在依赖关系,不同版本的依赖就会可能导致依赖间的相互冲突,进而导致整个项目加载的失败。

这篇文章主要记录了本次遇到的问题:即maven在面对不同版本的jar包在pom文件中同时声明会存在加载覆盖的问题,于是通过查询网上相关资料对maven包的加载规则介绍,并通过实际场景对其进行分析验证;

二、maven加载原则

1.最短路径原则:面对多级(两级及以上)的不同依赖,会优先选择路径最短的依赖;

2.声明优先原则:面对多级(两级及以上)的同级依赖,先声明的依赖会覆盖后声明的依赖;

3.同级依赖中,后声明的依赖会覆盖先声明的依赖;

三、本地验证maven加载原则

1.最短路径原则:使用最短路径加载的前提是,项目中存在两级以上的不同依赖jar包,此时项目会优先加载路径最短的jar包;

实际上手体验maven面对冲突Jar包的加载规则 | 京东云技术团队,硬核干货,后端,maven,jar,java

实例验证: 分别在common模块和service模块中间接和直接的引入不同版本的elasticsearch-rest-client,观察项目中面对不同路径长度情况下实际加载时所使用的版本情况。

common模块:common模块中引入elasticsearch-rest-high-level-client 依赖包, 而该依赖包它引入了 elasticsearch-rest-client 7.4.2, 从而实现在common模块中间接引用该包;

common的pom文件:

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

service模块: 为了验证不同路径长度下maven的包加载顺序 我们在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>

实际加载结果:在IDEA中加载pom文件时,可以在maven管理中看到已经提示jar包冲突;

实际上手体验maven面对冲突Jar包的加载规则 | 京东云技术团队,硬核干货,后端,maven,jar,java

mvn dependency:tree: 我们可以通过mvn dependency :tree命令来查看该项目的依赖树,观察发现实际加载的版本是elasticsearch-rest-client 6.8.13,符合maven中的最短路径优先原则;

实际上手体验maven面对冲突Jar包的加载规则 | 京东云技术团队,硬核干货,后端,maven,jar,java

  1. 声明优先原则:声明优先原则的前提是对于两级以上的同级依赖,先声明的依赖会覆盖后声明的依赖包;

实际上手体验maven面对冲突Jar包的加载规则 | 京东云技术团队,硬核干货,后端,maven,jar,java

实例验证: 针对该原则的验证场景构造不再关注模块是否直接或者间接引用不同版本的es,我们在common模块和service模块中都直接引用不同版本的es,然后通过改变两个模块在pom文件中声明的先后顺序来观察项目启动后实际加载的jar包;

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>

service模块:在service模块中引入依赖包elasticsearch-rest-client 6.8.13

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

实际加载结果:

▪场景1:我们将common模块在pom文件中先引入,然后将在service模块置于common模块后面引入,观察项目实际加载情况;

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

▪观察加载结果图,发现实际加载的是es-rest-client 7.4.2, 即确实是common模块声明生效,service模块后声明导致其中的es未被加载。符合声明优先原则;

实际上手体验maven面对冲突Jar包的加载规则 | 京东云技术团队,硬核干货,后端,maven,jar,java

◦场景2:我们将service模块在pom文件中先引入,然后将在common模块置于service模块后面引入,观察项目实际加载情况;;

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

▪观察项目实际加载结果图,发现实际加载的是es-rest-client 6.8.13, 即确实是模块声明生效,common模块后声明导致其中的es未被加载。发现符合声明优先原则;

实际上手体验maven面对冲突Jar包的加载规则 | 京东云技术团队,硬核干货,后端,maven,jar,java

◦声明优先原则场景验证结束

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

实际上手体验maven面对冲突Jar包的加载规则 | 京东云技术团队,硬核干货,后端,maven,jar,java

实例验证: 为了构造在同级依赖中的加载场景 我们在项目中直接引入两个不同es版本的依赖,然后同样通过改变两个es版本在pom中的声明顺序来观察项目实际加载的es版本。

▪场景1:我们首先验证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>

▪观察maven的实际加载结果如下,发现项目中实际加载的es-rest-client 版本是6.8.13,先声明的7.4.2版本并未实际加载到项目中。符合同级依赖中后加载覆盖先加载原则。

实际上手体验maven面对冲突Jar包的加载规则 | 京东云技术团队,硬核干货,后端,maven,jar,java

▪场景2:然后我们改变声明顺序,将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>

▪观察maven实际加载结果如下,发现项目中实际加载的es-rest-client 版本是7.4.2,先声明的6.8.13版本并未实际加载到项目中。符合同级依赖中后加载覆盖先加载原则。

实际上手体验maven面对冲突Jar包的加载规则 | 京东云技术团队,硬核干货,后端,maven,jar,java

四、常见异常

****Jar发生冲突后在程序启动时常见异常报错, 下面四种异常是能够直观表征Jar包加载冲突

◦程序抛出java.lang.ClassNotFoundException异常;

◦程序抛出java.lang.NoSuchMethodError异常;

◦程序抛出java.lang.NoClassDefFoundError异常;

◦程序抛出java.lang.LinkageError异常等;

五、总结

之前只是浅层的了解maven包的加载,没有结合具体的加载原则进行系统的学习验证,正好通过需求开发中遇到依赖冲突相关问题对maven的加载原则进行探究。ok,明白啦!

实际上手体验maven面对冲突Jar包的加载规则 | 京东云技术团队,硬核干货,后端,maven,jar,java

作者:京东科技 宋慧超

来源:京东云开发者社区文章来源地址https://www.toymoban.com/news/detail-600761.html

到了这里,关于实际上手体验maven面对冲突Jar包的加载规则 | 京东云技术团队的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Maven第八章:如何解决Maven的jar版本冲突

    前言 本文重点讲解Maven依赖冲突原因,maven依赖原则以及如何利用idea Maven Helper插件分析解决问题。 背景 开发过程中引入第三方jar遇到依赖冲突的,非常影响开发,甚至大部分时间都在调试版本兼容。

    2024年02月06日
    浏览(32)
  • Idea maven安装及卸载本地jar包的正确方法

    本地jar包位置:     直接从本地仓库删除下面对应文件夹即可:   无法从中央仓库下载依赖包; 打开cmd窗口,执行下面命令即可:      

    2024年02月15日
    浏览(37)
  • 【Maven】依赖管理—导入jar包的三种方式、依赖范围设置

    一、使用坐标导入 jar 包  二、使用坐标导入 jar 包 – 快捷方式  三、使用坐标导入 jar 包 – 自动导入  四、依赖范围 1、在 pom.xml 中编写 dependencies 标签 2、在 dependencies 标签中 使用 dependency 引入坐标 3、定义坐标的 groupId,artifactId,version 4、点击刷新按钮,使坐标生效 1、

    2024年02月16日
    浏览(39)
  • maven无法从阿里云中央仓库下载jar包的解决方法

    这个方法不一定适用于所有人。 问题描述:启动公司的SpringBoot项目时,maven爆红提示从阿里云中央仓库找不到目标jar包,但我本地maven仓库是有这个jar包的(版本也对的上),我就好奇maven为什么不从本地获取jar包呢?于是目标jar包本地仓库的路径发现:该jar包的路径下有一

    2024年02月11日
    浏览(32)
  • maven依赖jar包时版本冲突的解决

    在pom.xml配置文件中,如果有两个名称相同版本不同的依赖声明,那么先写的会生效。 直接依赖优先于传递依赖,如果传递依赖的jar包版本冲突了,那么可以自己声明一个指定版本的依赖jar,即可解决冲突。 传递依赖冲突时,可以在不需要的jar的传递依赖中声明排除,从而解

    2024年02月03日
    浏览(53)
  • 使用Gitee或GitHub托管Maven仓库JAR包的便捷方法

    原文地址:https://ntopic.cn/p/2023062201/ 我开源的JAR包的Gitee和GitHub托管的Maven仓库: Gitee托管仓库:https://gitee.com/obullxl/maven-repository GitHub托管仓库:https://github.com/obullxl/maven-repository 在上一篇博客中,我们介绍了 开源通用高性能分布式id序列组件 (https://ntopic.cn/p/2023062101/)的设

    2024年02月11日
    浏览(36)
  • Maven解决jar包版本冲突的4种方法

      先解释下maven的依赖传递:a jar包引入了b jar包,如果项目中引入了a jar包,其实也会把a依赖的b jar包引入。那现在有a、c这2个jar包,a jar包依赖的是1.0.0版本的b jar包,c jar包也依赖了b jar包,版本是2.0.0;如果项目中引入了a、c jar包,那b jar包到底引入哪个版本呢,是1.0.0还

    2024年02月15日
    浏览(30)
  • IDEA引入本地jar包的两种方法(idea程序引入和maven)

    公司买的第三方物联网设备,对接数据信息,需要引入他们自己的jar包进行开发。 1.打开idea找到项目结构 2.继续点击模块 3.继续点击+ 4.然后选择需要导入的jar包,点击完成,引用,就可以了 1.找到jar包所在文件夹,打开命令行界面cmd 2.运行命令 文件名称(文件地址)path-to-fi

    2024年04月10日
    浏览(39)
  • 【Maven】jar包冲突原因与最优解决方案

    【Maven】jar包冲突原因与 最优 解决方案 你是否经常遇到这样的报错: 以上报错就有可能是jar包冲突造成的,Maven中jar包冲突是开发过程中比较常见而又令人头疼的问题,我们需要知道 jar包冲突的原理,才能更好的去解决jar包冲突的问题。本文将从jar包冲突的原理和解决jar包

    2023年04月23日
    浏览(35)
  • flink类加载器原理与隔离(flink jar包冲突)

    本文是转载自袋鼠云公众号的文章 不知道大家有没有遇到过,flink发布任务遇到一些奇奇怪怪的报错,很奇怪的某个类就开始报错,一步一步点击去查看,发现不知道是哪个类包的那个类在报错,其实这种情况很有可能就是jar包版本冲突。 首先为大家介绍一下Java类加载器解

    2024年02月22日
    浏览(25)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包