实例验证:
分别在common模块和service模块中间接和直接的引入不同版本的elasticsearch-rest-client,观察项目中面对不同路径长度情况下实际加载时所使用的版本情况。
▪common模块: 在common模块中引入elasticsearch-rest-high-level-client 依赖包, 而该依赖包它引入了 elasticsearch-rest-client 7.4.2, 从而实现在common模块中间接引用该包;<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;
<dependencies> <dependency> <groupId>org.elasticsearch.client</groupId> <artifactId>elasticsearch-rest-client</artifactId> <version>6.8.13</version> </dependency> </dependencies>
▪实际加载结果:在IDEA中加载pom文件时,可以在maven管理中看到已经提示jar包冲突;
实例验证:
针对该原则的验证场景构造不再关注模块是否直接或者间接引用不同版本的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
<!-- 堆代码 duidaima.com --> <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>▪观察加载结果图,发现实际加载的是es-rest-client 7.4.2, 即确实是common模块的声明生效,service模块后声明导致其中的es未被加载。符合声明优先原则;
<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未被加载。发现符合声明优先原则;
◦实例验证:
为了构造在同级依赖中的加载场景 , 我们在项目中直接引入两个不同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版本并未实际加载到项目中。符合同级依赖中后加载覆盖先加载原则。
<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版本并未实际加载到项目中。符合同级依赖中后加载覆盖先加载原则。