女朋友他们项目用了 spring-boot,以 spring-boot-parent 作为 parent:

<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.0.9</version>
</parent>

女朋友最近想用 elasticsearch 作为搜索引擎,在项目中添加了依赖

<dependency><groupId>org.elasticsearch</groupId><artifactId>elasticsearch</artifactId><version>7.10.2</version>
</dependency>

写好代码,一跑,报类不存在异常:

 java.lang.NoClassDefFoundError: org/elasticsearch/common/xcontent/DeprecationHandlerat com.lv.springboot.datasource.ClientUTis.main(ClientUTis.java:13)
Caused by: java.lang.ClassNotFoundException: org.elasticsearch.common.xcontent.DeprecationHandlerat java.net.URLClassLoader.findClass(URLClassLoader.java:381)at java.lang.ClassLoader.loadClass(ClassLoader.java:424)at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)at java.lang.ClassLoader.loadClass(ClassLoader.java:357)... 1 more

女朋友看了依赖mvn dependency:tree,发现依赖的elasticsearch版本是:

org.elasticsearch.client:elasticsearch-rest-high-level-client:7.0.1
|--org.elasticsearch:elasticsearch:5.6.16
|--org.elasticsearch.client:elasticsearch-rest-client:7.0.1
|--org.elasticsearch.plugin:parent-join-client:7.0.1
|--org.elasticsearch.plugin:aggs-matrix-stats-client:7.0.1
|--org.elasticsearch.plugin:rank-eval-client:7.0.1
|--org.elasticsearch.plugin:lang-mustache-client:7.0.1

女朋友很着急,明明指定了elasticsearch的依赖了啊,而且是项目的根 pom,依赖不是最短路径原则么?不应该以这个依赖为准么?

女朋友于是找我求助,本着面向“对象”,我立马放下手头工作帮忙查看。仔细一看,原来SpringBoot的DependencyManagement中,org.elasticsearch:elasticsearch已经被包含了(以下为节选):

<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.0.9.RELEASE</version><properties>
<elasticsearch.version>5.6.16</elasticsearch.version>
</properties><dependencyManagement>
<dependencies>
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
<version>${elasticsearch.version}</version>
</dependency>
</dependencies>
</dependencyManagement>

spring-boot 其实已经考虑到用户可能要换版本了,所以将版本放入了 <properties/>,properties 也具有最短路径原则,所以可以通过在你的项目根 pom 中的 properties 增加相同 key 修改版本:

<properties>
<elasticsearch.version>7.10.2</elasticsearch.version>
</properties>

所有可以这么替换的属性, spring-boot 官方文档已经列出了,参考官方文档附录:Version Properties

也可以通过 dependencyManagement 的最短路径原则,通过在你的项目根 pom 中的增加想修改依赖的 dependencyManagement 即可:

<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
<version>7.10.2</version>
</dependency>
</dependencies>
</dependencyManagement>

最后,可以记住下面的原则,就知道项目的依赖到底是哪个版本啦:

Maven依赖可以分为如下几部分:

  1. 直接依赖,就是本项目 dependencies 部分的依赖
  2. 间接依赖,就是本项目 dependencies 部分的依赖所包含的依赖
  3. 依赖管理,就是本项目 dependency management 里面的依赖
  4. parent 的直接依赖
  5. parent 的间接依赖
  6. parent 的依赖管理
  7. bom 的直接依赖(一般没有)
  8. bom 的间接依赖(一般没有)
  9. bom 的依赖管理

可以这么理解依赖:

  1. 首先,将 parent 的直接依赖,间接依赖,还有依赖管理,插入本项目,放入本项目的直接依赖,间接依赖还有依赖管理之前
  2. 对于直接依赖,如果有 version,那么就依次放入 DependencyMap 中。如果没有 version,则从依赖管理中查出来 version,之后放入 DependencyMap 中。key 为依赖的 groupId + artifactId,value为version,后放入的会把之前放入的相同 key 的 value 替换
  3. 对于每个依赖,各自按照 1,2 加载自己的 pom 文件,但是如果第一步中的本项目 dependency management 中有依赖的版本,使用本项目 dependency management的依赖版本,生成 TransitiveDependencyMap,这里面就包含了所有的间接依赖。
  4. 所有间接依赖的 TransitiveDependencyMap, 对于项目的 DependencyMap 里面没有的 key,依次放入项目的 DependencyMap
  5. 如果 TransitiveDependencyMap 里面还有间接依赖,那么递归执行3, 4。

由于是先放入本项目的 DependencyMap,再去递归 TransitiveDependencyMap,这就解释了 maven 依赖的最短路径原则。

Bom 的效果基本和 Parent 一样,只是一般限制中,Bom 只有 dependencyManagement 没有 dependencies

解决了问题并且给妹子梳理明白之后,妹子答应这个月多给我 100 块零用钱啦,开心~~~~~

每日一刷,轻松提升技术,斩获各种offer:

急~为啥我指定的的maven依赖版本没有生效?不是最短路径原则吗?相关推荐

  1. 我爱Java系列---【 maven依赖版本冲突的解决方法】

    我爱Java系列---[ maven依赖版本冲突的解决方法] 参考文章: (1)我爱Java系列---[ maven依赖版本冲突的解决方法] (2)https://www.cnblogs.com/hu ...

  2. java——maven依赖版本冲突

    博客:maven依赖jar包时版本冲突的解决 转载于:https://www.cnblogs.com/Tpf386/p/11180007.html

  3. Maven依赖版本号不生效

    最近受log4j2的漏洞的影响,全网码农开始升级log4j2.我这里的服务也需要升级,但是我遇到了一个问题:修改依赖之后发现版本号没有变化. 一.依赖现状 项目A依赖了一个common包,common ...

  4. 解决Maven依赖版本不是最新的

    进入Maven库中找到对应文件夹删除 重新在Pom文件引入依赖自动拉取即可

  5. SpringBoot使用swagger-spring-boot-starter maven依赖包实现Swagger2

    前言 本文主要介绍SpringBoot框架下,如何使用swagger-spring-boot-starter maven依赖包实现Swagger2 适用于对SpringBoot+maven 有一定基础 ...

  6. Maven依赖的是本地工程还是仓库jar包?

    相信大家都碰见过maven配置的依赖或者是jar包或者是工程,在开发的过程当中,我们当然需要引入的是工程,这样查看maven依赖的文件的时候,就能直接查看到源码. 一.本地工程依赖 举个例子,其架构如 ...

  7. 下载maven依赖到指定目录

    文章目录 1 场景 2 方案 3 代码 3.1 目录 3.2 执行 1 场景 将maven依赖jar包和依赖jar包拷贝到指定目录 2 方案 使用maven插件maven-dependency-plu ...

  8. Maven设置指定jar包依赖版本信息

    我们在配置Spark core 的 maven依赖的时候jackson-module-scala_2.11的版本冲突,解决办法如下: <dependencies><dependenc ...

  9. 漫画谈一下Maven依赖,百分之90的同学不知道!

    Maven 依赖排除(Exclusions) 因为 Maven 构建的项目具有依赖可传递的特性,当你在 pom.xml添加某个依赖时,可能也会引入不需要的依赖到你的项目中,这将会会可能引起如下问题: ...

最新文章

  1. 分布式架构:并发重复请求和幂等场景技术实现总结
  2. python扩展库丰富吗_python扩展库
  3. FLASH STUDY LOG
  4. 【渝粤教育】电大中专新媒体营销实务 (13)作业 题库
  5. Python操作数据库(二)
  6. HTML5 -- WebSocket
  7. 计算机网络技术论文致谢,路由器论文致谢
  8. 旷视科技 CSG 算法负责人姚聪:深度学习时代的文字检测与识别技术 | AI 研习社 103 期大讲堂...
  9. Win10系统高分辨率缩放时应用程序字体模糊
  10. 什么是SQL Server数据字典?
  11. html折叠段落标记,HTML 段落标记“p”与换行标记,标题标记“h”!
  12. ios html fixed,ios下position:fixed失效的问题解决
  13. 华为电脑Linux进pe,华为 PE-TLOOM 开启USB调试模式
  14. APP安全性检查报告整改
  15. Html5小游戏 转微信小程序,白鹭H5游戏转微信小游戏问题集锦,你关心的都在这里...
  16. Python转换过程单双号处理(转载)
  17. 汽车材料QC/T 944-2013ELV中多溴联苯(PBBs)和多溴二苯醚(PBDEs)的检测
  18. Java系列技术之MySql数据库-钟洪发-专题视频课程
  19. ios pdf自动换行方法(解决中文乱码问题)
  20. 什么是骨传导耳机,骨传导耳机原理

热门文章

  1. 简单工厂和工厂方法模式的区别和个人看法
  2. SpringBoot-logback配置输出Json格式日志
  3. 哪些软件是用C++写的
  4. UltraEdit注册机使用教程
  5. iOS 堆栈获取异常分析
  6. pytest常用参数
  7. alios是安卓吗_全面了解AliOS、Android、QNX三大系统
  8. 简单易懂读《重构》 - Speculative Generality (高估未来的可能性)
  9. 32位和64位版本的Office异同点
  10. WC2015简短感想