maven 重复依赖不同版本 选择规则
本篇主要来看看 maven 对于 重复依赖的jar的不同版本时候 它内部的选择规则, 很多时候我们在搭建环境的时候 不注意就会存在依赖冲突等问题 那依赖冲突的时候 为什么maven选择了不是你如你所想的jar 版本呢 , 其实都是有一定规则的 下面来看看吧1.前言我们在使用maven 的时候 多多少少遇到过jar包冲突的问题, 在对一个jar包引入不同版本后,可能会导致NoSuchMethodError 错误, 那么你真的清楚 maven 在多个版本jar的时候是怎么去选择版本的呢? 如果理解这些 在加上一些依赖冲突辅助工具,可以让你更加快速的解决这类问题
2.重复依赖选择原则先把重复依赖后 选择原则抛出来 待会一个个进行验证
- 最短路径原则:两级以上的不同级依赖, 选择路径最短
- 声明优先原则 :两级以上的同级依赖,先声明的覆盖后声明的
- 同级依赖后加载覆盖先加载原则
- 创建web , service ,common 模块
- 使用 elasticsearch-rest-high-level-client 和 elasticsearch-rest-client 配合 演示
文章插图
![maven 重复依赖不同版本 选择规则](http://shimg.jingyanzongjie.com/230726/20154GQ7-1.png)
文章插图
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.13service 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模块中的下 就表示这个冲突了 不使用它![maven 重复依赖不同版本 选择规则](http://shimg.jingyanzongjie.com/230726/20154HA5-2.png)
文章插图
4.4 mvn dependency:tree可以通过 mvn dependency:tree 去查看 项目的依赖树 ,
可以看到 最短路径原则 生效了, maven 选择了短路径的 service模块的 elasticsearch-rest-client:6.8.13 版本
![maven 重复依赖不同版本 选择规则](http://shimg.jingyanzongjie.com/230726/20154L354-3.png)
文章插图
5.声明优先原则声明优先原则:前提是 两级以上的同级依赖, 先声明的覆盖后声明的
把上面的依赖结构改一下
![maven 重复依赖不同版本 选择规则](http://shimg.jingyanzongjie.com/230726/20154K129-4.png)
文章插图
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>
经验总结扩展阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 外卖的勺子耐高温吗 外卖的勺子能重复使用吗
- 哪些星座男恋爱啥事都依赖女票
- app自动化测试环境安装
- 创建SpringMVC工程
- 彼此独立又彼此依赖的星座情侣
- 重复率很低的无风格签名 小众风格的高级签名
- gradle项目对比maven项目的目录架构以及对gradle wrapper的理解
- 怎么抽金卡发字
- 营改增为什么可以避免重复征税
- 眉心重复长痘怎么处理