最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

maven依賴版本沒有按照最短路徑原則生效的解決方案

 更新時間:2021年01月29日 14:23:49   作者:干貨滿滿張哈希  
這篇文章主要介紹了maven依賴版本沒有生效的解決方案,幫助大家更好的理解和使用springboot框架,感興趣的朋友可以了解下

女朋友他們項目用了 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,發(fā)現(xiàn)依賴的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,依賴不是最短路徑原則么?不應(yīng)該以這個依賴為準么?

女朋友于是找我求助,本著面向“對象”,我立馬放下手頭工作幫忙查看。仔細一看,原來SpringBoot的DependencyManagement中,org.elasticsearch:elasticsearch已經(jīng)被包含了(以下為節(jié)選):

<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 其實已經(jīng)考慮到用戶可能要換版本了,所以將版本放入了 <properties/>,properties 也具有最短路徑原則,所以可以通過在你的項目根 pom 中的 properties 增加相同 key 修改版本:

<properties>
<elasticsearch.version>7.10.2</elasticsearch.version>
</properties>

所有可以這么替換的屬性, spring-boot 官方文檔已經(jīng)列出了,參考官方文檔附錄: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 里面還有間接依賴,那么遞歸執(zhí)行3, 4。

由于是先放入本項目的 DependencyMap,再去遞歸 TransitiveDependencyMap,這就解釋了 maven 依賴的最短路徑原則。

Bom 的效果基本和 Parent 一樣,只是一般限制中,Bom 只有 dependencyManagement 沒有 dependencies

解決了問題并且給妹子梳理明白之后,妹子答應(yīng)這個月多給我 100 塊零用錢啦,開心~~~~~

以上就是maven依賴版本沒有生效的解決方案的詳細內(nèi)容,更多關(guān)于maven依賴版本沒有生效的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Spring?Boot?接口加解密功能實現(xiàn)

    Spring?Boot?接口加解密功能實現(xiàn)

    在我們?nèi)粘5腏ava開發(fā)中,免不了和其他系統(tǒng)的業(yè)務(wù)交互,或者微服務(wù)之間的接口調(diào)用;如果我們想保證數(shù)據(jù)傳輸?shù)陌踩?,對接口出參加密,入?yún)⒔饷?,這篇文章主要介紹了Spring?Boot?接口加解密功能實現(xiàn),需要的朋友可以參考下
    2023-04-04
  • JAVA中Integer值的范圍實例代碼

    JAVA中Integer值的范圍實例代碼

    這篇文章主要介紹了JAVA中Integer值的范圍實例代碼,需要的朋友可以參考下
    2017-09-09
  • 帶你了解JAVA中的一些鎖概念

    帶你了解JAVA中的一些鎖概念

    今天小編就為大家分享一篇關(guān)于Java分布式鎖的概念與實現(xiàn)方式詳解,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2021-08-08
  • 基于Java解決華為機試實現(xiàn)整數(shù)與IP地址間的轉(zhuǎn)換?

    基于Java解決華為機試實現(xiàn)整數(shù)與IP地址間的轉(zhuǎn)換?

    這篇文章主要介紹了基于Java解決華為機試實現(xiàn)整數(shù)與IP地址間的轉(zhuǎn)換,文章舉例說明圍繞文章主題展開相關(guān)內(nèi)容,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-02-02
  • java如何讀取文件目錄返回樹形結(jié)構(gòu)

    java如何讀取文件目錄返回樹形結(jié)構(gòu)

    這篇文章主要介紹了java如何讀取文件目錄返回樹形結(jié)構(gòu)問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • 使用System.exit()來優(yōu)雅地終止SpringBoot項目的代碼示例

    使用System.exit()來優(yōu)雅地終止SpringBoot項目的代碼示例

    System.exit() 方法是 Java 中用于退出程序的方法,它接受一個整數(shù)參數(shù),通常被用來指示程序的退出狀態(tài),本文給大家介紹了如何使用System.exit()來優(yōu)雅地終止SpringBoot項目,需要的朋友可以參考下
    2024-08-08
  • Java 語言中Object 類和System 類詳解

    Java 語言中Object 類和System 類詳解

    Object 是 Java 類庫中的一個特殊類,也是所有類的父類。今天通過本文給大家介紹java object類的簡單概念及常用方法,需要的朋友參考下吧
    2021-07-07
  • AndroidQ沙盒機制之分區(qū)存儲適配

    AndroidQ沙盒機制之分區(qū)存儲適配

    這篇文章主要介紹了AndroidQ沙盒機制之分區(qū)存儲適配,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-06-06
  • 詳解Java線程堆棧

    詳解Java線程堆棧

    本篇文章主要給大家講了Java線程堆棧的詳細原理以及用法,需要的朋友跟著學習下吧。
    2017-12-12
  • Java面試題沖刺第二十天--算法(1)

    Java面試題沖刺第二十天--算法(1)

    這篇文章主要為大家分享了最有價值的三道關(guān)于算法的面試題,涵蓋內(nèi)容全面,包括數(shù)據(jù)結(jié)構(gòu)和算法相關(guān)的題目、經(jīng)典面試編程題等,感興趣的小伙伴們可以參考一下
    2021-08-08

最新評論

木兰县| 茶陵县| 盘山县| 尉氏县| 永安市| 周至县| 上栗县| 张家口市| 扶余县| 鸡西市| 宜城市| 扎赉特旗| 正宁县| 阳泉市| 大化| 抚州市| 霞浦县| 福清市| 太原市| 云龙县| 太和县| 平南县| 婺源县| 巴南区| 石城县| 清涧县| 淮滨县| 达尔| 双辽市| 思茅市| 长治市| 仙游县| 吉安市| 石城县| 惠安县| 宁明县| 红河县| 广西| 西吉县| 墨竹工卡县| 故城县|