急~为啥我指定的的maven依赖版本没有生效?不是最短路径原则吗?
女朋友他们项目用了 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依赖可以分为如下几部分:
- 直接依赖,就是本项目 dependencies 部分的依赖
- 间接依赖,就是本项目 dependencies 部分的依赖所包含的依赖
- 依赖管理,就是本项目 dependency management 里面的依赖
- parent 的直接依赖
- parent 的间接依赖
- parent 的依赖管理
- bom 的直接依赖(一般没有)
- bom 的间接依赖(一般没有)
- bom 的依赖管理
可以这么理解依赖:
- 首先,将 parent 的直接依赖,间接依赖,还有依赖管理,插入本项目,放入本项目的直接依赖,间接依赖还有依赖管理之前
- 对于直接依赖,如果有 version,那么就依次放入 DependencyMap 中。如果没有 version,则从依赖管理中查出来 version,之后放入 DependencyMap 中。key 为依赖的 groupId + artifactId,value为version,后放入的会把之前放入的相同 key 的 value 替换
- 对于每个依赖,各自按照 1,2 加载自己的 pom 文件,但是如果第一步中的本项目 dependency management 中有依赖的版本,使用本项目 dependency management的依赖版本,生成 TransitiveDependencyMap,这里面就包含了所有的间接依赖。
- 所有间接依赖的 TransitiveDependencyMap, 对于项目的 DependencyMap 里面没有的 key,依次放入项目的 DependencyMap
- 如果 TransitiveDependencyMap 里面还有间接依赖,那么递归执行3, 4。
由于是先放入本项目的 DependencyMap,再去递归 TransitiveDependencyMap,这就解释了 maven 依赖的最短路径原则。
Bom 的效果基本和 Parent 一样,只是一般限制中,Bom 只有 dependencyManagement 没有 dependencies
解决了问题并且给妹子梳理明白之后,妹子答应这个月多给我 100 块零用钱啦,开心~~~~~
每日一刷,轻松提升技术,斩获各种offer:
急~为啥我指定的的maven依赖版本没有生效?不是最短路径原则吗?相关推荐
- 我爱Java系列---【 maven依赖版本冲突的解决方法】
我爱Java系列---[ maven依赖版本冲突的解决方法] 参考文章: (1)我爱Java系列---[ maven依赖版本冲突的解决方法] (2)https://www.cnblogs.com/hu ...
- java——maven依赖版本冲突
博客:maven依赖jar包时版本冲突的解决 转载于:https://www.cnblogs.com/Tpf386/p/11180007.html
- Maven依赖版本号不生效
最近受log4j2的漏洞的影响,全网码农开始升级log4j2.我这里的服务也需要升级,但是我遇到了一个问题:修改依赖之后发现版本号没有变化. 一.依赖现状 项目A依赖了一个common包,common ...
- 解决Maven依赖版本不是最新的
进入Maven库中找到对应文件夹删除 重新在Pom文件引入依赖自动拉取即可
- SpringBoot使用swagger-spring-boot-starter maven依赖包实现Swagger2
前言 本文主要介绍SpringBoot框架下,如何使用swagger-spring-boot-starter maven依赖包实现Swagger2 适用于对SpringBoot+maven 有一定基础 ...
- Maven依赖的是本地工程还是仓库jar包?
相信大家都碰见过maven配置的依赖或者是jar包或者是工程,在开发的过程当中,我们当然需要引入的是工程,这样查看maven依赖的文件的时候,就能直接查看到源码. 一.本地工程依赖 举个例子,其架构如 ...
- 下载maven依赖到指定目录
文章目录 1 场景 2 方案 3 代码 3.1 目录 3.2 执行 1 场景 将maven依赖jar包和依赖jar包拷贝到指定目录 2 方案 使用maven插件maven-dependency-plu ...
- Maven设置指定jar包依赖版本信息
我们在配置Spark core 的 maven依赖的时候jackson-module-scala_2.11的版本冲突,解决办法如下: <dependencies><dependenc ...
- 漫画谈一下Maven依赖,百分之90的同学不知道!
Maven 依赖排除(Exclusions) 因为 Maven 构建的项目具有依赖可传递的特性,当你在 pom.xml添加某个依赖时,可能也会引入不需要的依赖到你的项目中,这将会会可能引起如下问题: ...
最新文章
- 分布式架构:并发重复请求和幂等场景技术实现总结
- python扩展库丰富吗_python扩展库
- FLASH STUDY LOG
- 【渝粤教育】电大中专新媒体营销实务 (13)作业 题库
- Python操作数据库(二)
- HTML5 -- WebSocket
- 计算机网络技术论文致谢,路由器论文致谢
- 旷视科技 CSG 算法负责人姚聪:深度学习时代的文字检测与识别技术 | AI 研习社 103 期大讲堂...
- Win10系统高分辨率缩放时应用程序字体模糊
- 什么是SQL Server数据字典?
- html折叠段落标记,HTML 段落标记“p”与换行标记,标题标记“h”!
- ios html fixed,ios下position:fixed失效的问题解决
- 华为电脑Linux进pe,华为 PE-TLOOM 开启USB调试模式
- APP安全性检查报告整改
- Html5小游戏 转微信小程序,白鹭H5游戏转微信小游戏问题集锦,你关心的都在这里...
- Python转换过程单双号处理(转载)
- 汽车材料QC/T 944-2013ELV中多溴联苯(PBBs)和多溴二苯醚(PBDEs)的检测
- Java系列技术之MySql数据库-钟洪发-专题视频课程
- ios pdf自动换行方法(解决中文乱码问题)
- 什么是骨传导耳机,骨传导耳机原理