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 配合 演示
4.最短门路准则
最短门路准则的前提是 两级以上的不同级依赖, 抉择门路最短
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模块中的下 就示意这个抵触了 不应用它
4.4 mvn dependency:tree
能够通过 mvn dependency:tree 去查看 我的项目的依赖树 , 能够看到 最短门路准则 失效了, maven 抉择了短门路的 service模块的 elasticsearch-rest-client:6.8.13 版本
5.申明优先准则
申明优先准则: 前提是 两级以上的同级依赖, 先申明的笼罩后申明的
把下面的依赖构造改一下
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 中的依赖
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 中的依赖
至此申明优先准则 验证结束
6.同级依赖后加载 笼罩 先加载准则
将依赖改成如下
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
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
7. idea 插件 maven helper
最初 举荐一款 idea 中 能够剖析疾速解决 maven 依赖抵触的 插件 maven helper
上面依赖标注的 6.8.13 也示意了 以后maven 抉择的 jar 版本
总结
本篇十分具体了介绍了 maven 中当有反复依赖不同版本jar 的时候 maven 抉择jar的 几个规定,并且都一一做了 验证, 你学会了吗, maven 平时咱们都是只是 复制粘贴用一用 然而当你遇到问题的时候 须要疾速解决它的能力,加油吧!
欢送大家拜访 集体博客 Johnny小屋
欢送关注集体公众号