急~为啥我指定的的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依賴可以分為如下幾部分:
可以這么理解依賴:
由于是先放入本項目的 DependencyMap,再去遞歸 TransitiveDependencyMap,這就解釋了 maven 依賴的最短路徑原則。
Bom 的效果基本和 Parent 一樣,只是一般限制中,Bom 只有 dependencyManagement 沒有 dependencies
解決了問題并且給妹子梳理明白之后,妹子答應這個月多給我 100 塊零用錢啦,開心~~~~~
每日一刷,輕松提升技術,斬獲各種offer:
總結
以上是生活随笔為你收集整理的急~为啥我指定的的maven依赖版本没有生效?不是最短路径原则吗?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何通过美股交易软件完成开户?美股开户交
- 下一篇: Unity资源处理机制(Assets/W