首页 > 应用开发 > IT综合 > 实际上手体验maven面对冲突Jar包的加载规则
一、 问题背景
相信大家在日常的开发过程中都遇到过Jar包冲突的问题,emm,在最近处理业务需求时我也遇到了不同版本jar包冲突导致项目加载出错的问题。主要是一个完整的项目会不可避免的使用第三方的Jar包来实现功能开发,各种第三方包之间可能会存在依赖关系,不同版本的依赖就会可能导致依赖间的相互冲突,进而导致整个项目加载的失败。
这篇文章主要记录了本次遇到的问题:即maven在面对不同版本的jar包在pom文件中同时声明会存在加载覆盖的问题,于是通过查询网上相关资料对maven包的加载规则介绍,并通过实际场景对其进行分析验证;

二、 maven加载原则
三、 本地验证maven加载原则

common 的pom文件:
<dependencies> <dependency> <groupId>org.elasticsearch.client</groupId> <artifactId>elasticsearch-rest-high-level-client</artifactId> <version>7.4.2</version> </dependency> </dependencies>
service的pom文件:
<dependencies> <dependency> <groupId>org.elasticsearch.client</groupId> <artifactId>elasticsearch-rest-client</artifactId> <version>6.8.13</version> </dependency> </dependencies>


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

<dependencies> <dependency> <groupId>org.elasticsearch.client</groupId> <artifactId>elasticsearch-rest-client</artifactId> <version>7.4.2</version> </dependency> </dependencies>
<dependencies> <dependency> <groupId>org.elasticsearch.client</groupId> <artifactId>elasticsearch-rest-client</artifactId> <version>6.8.13</version> </dependency> </dependencies>
<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>

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

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

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

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

四、 常见异常
Jar发生冲突后在程序启动时常见 异常报错,下面 四种异常是能够直观表征 Jar包加载冲突:
java.lang.ClassNotFoundException异常;java.lang.NoSuchMethodError异常;java.lang.NoClassDefFoundError异常;java.lang.LinkageError异常等;五、 总结
之前只是浅层的了解maven包的加载,没有结合具体的加载原则进行系统的学习验证,正好通过需求开发中遇到依赖冲突相关问题对maven的加载原则进行探究。ok,明白啦!

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/70037994/viewspace-3024488/ ,如需转载,请注明出处,否则将追究法律责任。