女友他們項目用了 spring-boot
,以 spring-boot-parent
做爲 parent:html
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.9</version> </parent>
女友最近想用 elasticsearch
做爲搜索引擎,在項目中添加了依賴java
<dependency> <groupId>org.elasticsearch</groupId> <artifactId>elasticsearch</artifactId> <version>7.10.2</version> </dependency>
寫好代碼,一跑,報類不存在異常:spring
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
版本是:springboot
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,依賴不是最短路徑原則麼?不該該以這個依賴爲準麼?elasticsearch
女友因而找我求助,本着面向「對象」,我立馬放下手頭工做幫忙查看。仔細一看,原來SpringBoot的DependencyManagement中,org.elasticsearch:elasticsearch
已經被包含了(如下爲節選):maven
<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 修改版本:ide
<properties> <elasticsearch.version>7.10.2</elasticsearch.version> </properties>
全部能夠這麼替換的屬性, spring-boot 官方文檔已經列出了,參考官方文檔附錄:Version Propertiesspring-boot
也能夠經過 dependencyManagement 的最短路徑原則,經過在你的項目根 pom 中的增長想修改依賴的 dependencyManagement 便可:搜索引擎
<dependencyManagement> <dependencies> <dependency> <groupId>org.elasticsearch</groupId> <artifactId>elasticsearch</artifactId> <version>7.10.2</version> </dependency> </dependencies> </dependencyManagement>
最後,能夠記住下面的原則,就知道項目的依賴究竟是哪一個版本啦:.net
Maven依賴能夠分爲以下幾部分:
能夠這麼理解依賴:
因爲是先放入本項目的 DependencyMap,再去遞歸 TransitiveDependencyMap,這就解釋了 maven 依賴的最短路徑原則。
Bom 的效果基本和 Parent 同樣,只是通常限制中,Bom 只有 dependencyManagement 沒有 dependencies
解決了問題而且給妹子梳理明白以後,妹子答應這個月多給我 100 塊零用錢啦,開心~
每日一刷,輕鬆提高技術,斬獲各類offer: