lt;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未被加载。发现符合声明优先原则;
?声明优先原则场景验证结束;
3. 同级依赖中后加载覆盖先加载原则;
?实例验证: 为了构造在同级依赖中的加载场景 , 我们在项目中直接引入两个不同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版本并未实际加载到项目中。符合同级依赖中后加载覆盖先加载原则。
?场景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版本并未实际加载到项目中。符合同级依赖中后加载覆盖先加载原则。
四、常见异常
****Jar发生冲突后在程序启动时常见异常报错, 下面四种异常是能够直观表征Jar包加载冲突:
?程序抛出java.lang.ClassNotFoundException
异常;
?程序抛出java.lang.NoSuchMethodError
异常;
?程序抛出java.lang.NoClassDefFoundError
异常;
?程序抛出java.lang.LinkageError
异常等;
五、总结
之前只是浅层的了解maven包的加载,没有结合具体的加载原则进行系统的学习验证,正好通过需求开发中遇到依赖冲突相关问题对maven的加载原则进行探究。ok,明白啦!
作者:京东科技 宋慧超
来源:京东云开发者社区