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/DeprecationHandler
 at com.lv.springboot.datasource.ClientUTis.main(ClientUTis.java:13)
Caused by: java.lang.ClassNotFoundException: org.elasticsearch.common.xcontent.DeprecationHandler
 at 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 的依赖管理

可以这么理解依赖:

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 块零用钱啦,开心~~~~~

以上就是maven依赖版本没有生效的解决方案的详细内容,更多关于maven依赖版本没有生效的资料请关注我们其它相关文章!

(0)

相关推荐

  • IDEA 2020.1 版自动导入MAVEN依赖的方法(新版MAVEN无法自动导入/更新POM依赖、MAVEN设置自动更新、自动更新快捷键)

    新版的IDEA为了防止 pom 更新时,MAVEN 自动导包时卡死的问题,取消了自动导包机制.但新增了导入按钮和快捷键. 问题 idea 升级到 2020.x 版后,变更 MAVEN 不会自动更新依赖.也没有设置选项. 解决 通用方案 当我们修改了 maven 依赖以后,当前 pom 文件的右上角会出现一个 maven 的小图标,点一下就可以更新依赖了. 快捷键方案 将鼠标放到 maven 图标上后,会出现快捷键提示. MAC Shift + Command + O Windows:Ctrl +

  • IDEA maven依赖错误中包下面红色波浪线

    我在给别的开发同事搭建开发环境的时候 经常遇到项目中报红色波浪线的问题. 类似下面的图片 具体原因不详 : 怀疑是包下载不全 下面给出三种解决方案 终极方法 利用maven指令重新下载相关的依赖包,修改pom文件,执行clean, 修改pom文件,reimport 方案一 修改pom 配置文件,将标红的依赖先删除,并点击reimport, 之后重新加上出错的依赖,再reimport 方案二 从删除本地仓库中的文件目录,强制 maven 重新下载该包 终极方法 参考文章:https://www.j

  • Maven pom.xml 添加本地jar包依赖以及打包方法

    Maven项目打包时,如果遇到需要添加本地jar包依赖的时候,可以选择两种方法: 1. 安装到本地仓库 第一种方法比较常规,适用于需要添加的jar包也是由maven项目导出,含有pom文件的时候.只需要将jar包安装到本地maven仓库下,然后添加依赖即可. (1)安装到本地仓库,执行以下命令(其中的-Dfile/-DgroupId/-DartifactId/-Dversion项根据pom文件内容填写): mvn install:install-file -Dfile=xxxxx.jar -Dg

  • Maven导入依赖时报错如何解决

    一.问题来源 1.遇到问题的环境:idea,windows. 2.遇到标题所诉的问题 如下图: 二.问题分析 遇到这个问题,就是说明你这个jar包没有导入. 三.解决办法 1.首先先确认你的maven的下面红框三个属性是不是正确的: 2.如果是不正确的,那就改正确重新导入依赖,如果正确,就看看报错信息,是不是因为没安装国内镜像导致的依赖jar包下载不了 3.如果上面的都没错,请查看上图中的Woke offline有没有给勾上,勾上就需要取消勾选,这个东西勾上了就不能联网了. 以上就是本文的全部内

  • 基于IDEA查看maven依赖结构流程解析

    打开方式: 方法一:该工具有个Maven Projects窗口,一般在右侧能够找到,如果没有可以从菜单栏打开:View>Tool Windows>Maven Projects:选择要分析的maven module(idea的module相当于eclipse的project),右击[Show Dependencies...],会出来该module的全部依赖关系图 方法二:在Maven Projects窗口中,点击如下图标,或者使用快捷键 Ctrl + Alt + Shift +U 经过这一步就可

  • idea重新下载已删除的maven依赖包操作

    由于依赖包更新,需要重新引入,但是删掉旧包之后重新构建却无法自动下载新包,即使是重启idea也不会自动下载. 其实重新下载的方法很简单,右键项目->maven->Reimport即可. 如下图: 补充:idea中maven的使用问题(配置,命令,idea中重新下载包) idea中自带的maven的路径:D:\Program Files\JetBrains\IntelliJ IDEA 2019.2.2\plugins\maven\lib\maven3 1.配置环境变量 变量名:MAVEN_HOM

  • IDEA中创建maven项目引入相关依赖无法下载jar问题及解决方案

    先如今idea中的spring项目,springBoot的项目的开发一般都是基于maven创建的项目.这大大简化我我们对于各种依赖包的管理,同时又使得各种依赖包方便管理.但是当maven中的依赖下载出现问题的时候也是很头痛. 问题场景 在公司的项目中用到了fastjson依赖,而依赖的版本是动态获取的,如图 但是在某天启动项目的时候报错,一查看原来是maven中fastjson依赖的原因, 这时大部分的人的操作应该和我一样: 操作1 点击maven的更新按钮,让maven自动下载对应的jar包到

  • IDEA中Maven依赖包下载不了的问题解决方案汇总

    这个依赖包下载不了的问题真的是很烦,之前一直把下载不上的依赖剪切再粘贴到pom.xml文件中,保存它就自动下载了,但是今天怎么剪切粘贴都没用,所以就花了点时间在网上各种搜解决方案,试了一些之后终于从根本上解决了问题,所以写个博客把解决这个问题的方案汇总一下! 1. 先是对图上的两个位置一番狂点进行刷新,然并卵... 于是又按照博客上的指示去寻找 Settings -> Build,Execution,Deployment -> Build Tools -> Maven -> Ign

  • 微服务中使用Maven BOM来管理你的版本依赖详解

    BOM简介 BOM(Bill of Materials)是由Maven提供的功能,它通过定义一整套相互兼容的jar包版本集合,使用时只需要依赖该BOM文件,即可放心的使用需要的依赖jar包,且无需再指定版本号.BOM的维护方负责版本升级,并保证BOM中定义的jar包版本之间的兼容性. 为什么要使用BOM 使用BOM除了可以方便使用者在声明依赖的客户端时不需要指定版本号外,最主要的原因是可以解决依赖冲突,如考虑以下的依赖场景: 项目A依赖项目B 2.1和项目C 1.2版本: 项目B 2.1依赖项目

  • 解决IDEA中Maven依赖包导入失败报红问题(总结最有效8种解决方案)

    问题描述: 真的,说来话长,这应该是我花最多时间去解决关于Maven依赖包导入的问题,以前粘贴复制导入,自动下载成功了, 这次怎么搞,怎么让他自动下载都还是红红的一片, 花了大半天,各种尝试,只为搏得问题解决!!! 真的看着都难受, 但是, 终于, 还是让我搞定了,这次让我汇总所有最有可能解决这依赖问题的方法,下次遇到这种问题, 真的要说再见了 , 话不多开,开货!!!方案1:(本人平时遇到这问题的常规操作) 当一开始遇到导入的依赖报红了,直接把那段刚导入的对应依赖删了,然后又重新导入,它自动会

随机推荐