美文网首页
急~为啥我指定的的maven依赖版本没有生效?不是最短路径原则吗

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

作者: 干货满满张哈希 | 来源:发表于2021-01-29 12:00 被阅读0次

女朋友他们项目用了 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依赖可以分为如下几部分:

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

相关文章

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

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

  • Maven的依赖仲裁原则

    * 第一原则:最短路径优先原则 A依赖了B和C,B也依赖了C,那么Maven会使用A依赖的C版本,因为它的路径是最...

  • Maven依赖原则

    1. 依赖路径最短优先原则 由于 X(2.0) 路径最短,所以使用 X(2.0)。 2. 声明顺序优先原则 在 P...

  • maven依赖冲突解决

    一、maven自己调节原则1.第一申明优先原则.谁先依赖就导入谁的jar包2.路径近者优先原则直接依赖比传递依赖大...

  • maven依赖

    maven的依赖调度,当有两个版本的依赖,首先会选择路径最近的依赖,如果路径一样长,会按照pom的声明顺序依赖。 ...

  • 架构师——mysql

    maven:用nexus搭建私服:上传和下载jar包依赖冲突:最短路径/最先声明/excusion spring源...

  • 知识点

    1.Maven项目,在向其中添加依赖时,一定要加上版本 才行,否则无法生效。如:

  • [java]maven编译没有mapper.xml

    springboot的maven插件请指定资源路径!!!

  • Maven 从仓库解析依赖的机制

    当本地仓库没有依赖构件的时候,Maven 会自动从远程仓库下载;当依赖版本为快照版本的时候,Maven 会自动找到...

  • Maven中配置本地依赖组件包

    Maven添加本地的依赖包,可以通过以下两种方式进行添加。 第一种:指定本地依赖包的路径 具体配置录下: Xml代...

网友评论

      本文标题:急~为啥我指定的的maven依赖版本没有生效?不是最短路径原则吗

      本文链接:https://www.haomeiwen.com/subject/xyjqtltx.html