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

Maven 依賴原則和依賴沖突的使用小結(jié)

 更新時(shí)間:2026年07月16日 08:35:19   作者:prcyang  
本文主要介紹了Maven依賴傳遞原則、最短路徑優(yōu)先和聲明順序優(yōu)先,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

1、maven依賴傳遞原則

1.1 依賴路徑最短優(yōu)先原則

工程A的依賴關(guān)系如上圖,maven會(huì)根據(jù)依賴路徑最短優(yōu)先原則,選擇X(2.0)

1.2 pom文件中申明順序優(yōu)先

如果A的依賴關(guān)系如上圖,X(1.0)和X(2.0) 路徑距離一樣的話,maven會(huì)根據(jù)A的pom文件聲明的順序加載,如果先聲明了B,后聲明了C,那就最后的依賴就會(huì)是X(1.0)。

1.3 覆寫(xiě)優(yōu)先

  • 子Pom內(nèi)聲明的優(yōu)先于父 Pom 中的依賴。
  • 同Pom內(nèi)出現(xiàn)不同版本的相同類庫(kù)時(shí),后聲明的會(huì)覆蓋先聲明的。也就是在同一個(gè)Pom里配置了相同資源的不同版本的直接依賴,后配置的覆蓋先配置的

2 如何排除依賴

2.1 什么是傳遞性依賴

比如當(dāng)我們項(xiàng)目中,引用了A的依賴,A的依賴通常又會(huì)引入B的 Jar 包,B可能還會(huì)引入C的 Jar 包。
這樣,當(dāng)你在 pom.xml 文件中添加了A的依賴,Maven 會(huì)自動(dòng)的幫你把所有相關(guān)的依賴都添加進(jìn)來(lái)。
就這樣一層層的,Maven 會(huì)自動(dòng)的幫你把所有相關(guān)的依賴都添加進(jìn)來(lái)。傳遞性依賴會(huì)給項(xiàng)目引入很多依賴,簡(jiǎn)化項(xiàng)目依賴管理,但是也會(huì)帶來(lái)問(wèn)題。
最明顯的就是容易發(fā)生依賴沖突。

2.2 如何排除依賴

這種情況下,想要解決依賴沖突,可以靠升級(jí)/降級(jí)某些依賴項(xiàng)的版本,從而讓不同依賴引入的同一類庫(kù),保持一致的版本號(hào)。另外,還可以通過(guò)隱藏依賴、或者排除特定的依賴項(xiàng)來(lái)解決問(wèn)題。

2.2.1 exclusions 標(biāo)簽

Exclusions是主動(dòng)斷開(kāi)依賴的資源,被排除的資源無(wú)需指定版本
也就是說(shuō)可以包含一個(gè)或者多 Exclusion 子元素,因此可以排除一個(gè)或者多個(gè)傳遞性依賴。需要注意的是,聲明 Exclusion 的時(shí)候只需要 Groupld 和 Artifactld ,而不需要要 Version 元素。

用法示例:

<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-web</artifactId>
  <version>5.1.8.RELEASE</version>
  <exclusions>
    <!-- 排除web包依賴的beans包 -->
    <exclusion>
      <groupId>org.springframework</groupId>
      <artifactId>spring-beans</artifactId>
    </exclusion>
  </exclusions>
</dependency>

2.2.2 optional 標(biāo)簽

該標(biāo)簽即是“隱藏依賴”的開(kāi)關(guān),指對(duì)外隱藏當(dāng)前所依賴的資源

true:開(kāi)啟隱藏,當(dāng)前依賴不會(huì)向其他工程傳遞,只保留給自己用;
false:默認(rèn)值,表示當(dāng)前依賴會(huì)保持傳遞性,其他引入當(dāng)前工程的項(xiàng)目會(huì)間接依賴。

用法示例:
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-aop</artifactId>
  <version>5.1.8.RELEASE</version>
  <optional>true</optional>
</dependency>

2.2.3 exclusions標(biāo)簽和optional標(biāo)簽的區(qū)別

  • A依賴B,B依賴C , C 通過(guò)依賴傳遞會(huì)被 A 使用到,現(xiàn)在要想辦法讓 A 不去依賴 C
  • ( A是demo01,B是demo02,C是aop)
  • 可選依賴是在B上設(shè)置 , A 不知道有 C 的存在,代表這個(gè)依賴是否需要被發(fā)現(xiàn)。這種適用于可以修改B(02)的配置文件的情況下 先看默認(rèn)情況,也就是false

改為 true 后

排除依賴是在A上設(shè)置 , A 知道有 C 的存在,主動(dòng)將其排除掉。代表這個(gè)依賴已經(jīng)被A發(fā)現(xiàn),但A不需要引用C。這種適用于不能修改B的配置文件的情況下

3 Maven 聚合工程 統(tǒng)一管理版本

聚合工程,即是指:一個(gè)項(xiàng)目允許創(chuàng)建多個(gè)子模塊,多個(gè)子模塊組成一個(gè)整體,可以統(tǒng)一進(jìn)行項(xiàng)目的構(gòu)建。要弄明白聚合工程,得先清楚“父子工程”的概念:

  • 父工程:不具備任何代碼、僅有pom.xml的空項(xiàng)目,用來(lái)定義公共依賴、插件和配置;
  • 子工程:編寫(xiě)具體代碼的子項(xiàng)目,可以繼承父工程的配置、依賴項(xiàng),還可以獨(dú)立拓展。
    而Maven聚合工程,就是基于父子工程結(jié)構(gòu),來(lái)將一個(gè)完整項(xiàng)目,劃分出不同的層次,這種方式可以很好的管理多模塊之間的依賴關(guān)系,以及構(gòu)建順序,大大提高了開(kāi)發(fā)效率、維護(hù)性。

為了防止不同子工程引入不同版本的依賴,在父工程中,統(tǒng)一對(duì)依賴的版本進(jìn)行控制,規(guī)定所有子工程都使用同一版本的依賴,可以使用<dependencyManagement>標(biāo)簽來(lái)管理。

  • <dependencies>:定義強(qiáng)制性依賴,寫(xiě)在該標(biāo)簽里的依賴項(xiàng),子工程必須強(qiáng)制繼承;
  • <dependencyManagement>:定義可選性依賴,該標(biāo)簽里的依賴項(xiàng),子工程可選擇使用。
    子工程在使用中已有的依賴項(xiàng)時(shí),不需要寫(xiě)版本號(hào),版本號(hào)在父工程中統(tǒng)一管理,這樣做的好處在于:以后為項(xiàng)目的技術(shù)棧升級(jí)版本時(shí),不需要單獨(dú)修改每個(gè)子工程的POM,只需要修改父POM文件即可,減少了版本沖突的可能性。

4 定位沖突

4.1 maven show dependencies

IDEA中自帶一個(gè)功能,maven show dependencies,右擊pom文件可以調(diào)出,或者右上角的快捷鍵也可以調(diào)出

maven show dependencies,會(huì)為我們顯示一棵maven的依賴樹(shù):

藍(lán)色箭頭是正常的依賴關(guān)系,紅色箭頭是依賴沖突關(guān)系。

如果依賴太多,ctrl+F可以彈出依賴列表,在其中可以選擇想定位到的依賴:

很遺憾的是maven show dependencies這種方式的場(chǎng)景實(shí)在是有限,正常的稍微上一點(diǎn)體量的項(xiàng)目,依賴樹(shù)都會(huì)很大,用這種方式會(huì)把人看傻。

這里我隨便拿一個(gè)博主經(jīng)歷過(guò)的項(xiàng)目上的依賴樹(shù)拿出來(lái),是長(zhǎng)這樣的:

這種依賴樹(shù),根本就沒(méi)辦法去看,就算定位到了,依賴路徑的線條你都找不清楚。所以就沒(méi)有辦法了嗎?當(dāng)然是有的,這就是IDEA的一款插件,我們的maven依賴沖突分析利器——maven helper。

4.2 Maven Helper 插件分析jar包沖突

如果你的項(xiàng)目中依賴許許多多的 Jar ,肉眼排查就沒(méi)那么方便了,這里推薦一個(gè) Maven 管理插件

在 Pom 文件中看到 Dependency Analyzer標(biāo)志,說(shuō)明 Maven Helper 插件就安裝成功了

點(diǎn)擊 Dependency Analyzer 之后就會(huì)進(jìn)入到下面的頁(yè)面

從圖中可以看出有哪些jar存在沖突,存在沖突的情況下最終采用了哪個(gè)依賴的版本。標(biāo)紅的就是沖突版本,白色的是當(dāng)前的解析版本。

如果我們想保留標(biāo)紅的版本,那我們可以標(biāo)白區(qū)域右擊選擇排除(Exclude)即可。

到此這篇關(guān)于Maven 依賴原則和依賴沖突的使用小結(jié)的文章就介紹到這了,更多相關(guān)Maven 依賴原則和依賴沖突內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java中重載,繼承,重寫(xiě)和多態(tài)的區(qū)別

    java中重載,繼承,重寫(xiě)和多態(tài)的區(qū)別

    這篇文章主要介紹了java中重載,繼承,重寫(xiě)和多態(tài)的區(qū)別,需要的朋友可以參考下
    2014-07-07
  • java實(shí)現(xiàn)快速打字游戲

    java實(shí)現(xiàn)快速打字游戲

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)快速打字游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-07-07
  • Java?Jar包項(xiàng)目?jī)?nèi)存設(shè)置方法舉例

    Java?Jar包項(xiàng)目?jī)?nèi)存設(shè)置方法舉例

    這篇文章主要給大家介紹了關(guān)于Java?Jar包項(xiàng)目?jī)?nèi)存設(shè)置方法的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2024-01-01
  • JavaSE學(xué)習(xí)之內(nèi)部類及常用API

    JavaSE學(xué)習(xí)之內(nèi)部類及常用API

    這篇文章主要介紹了JavaSE中的內(nèi)部類和幾個(gè)常用的API,文中的示例代碼介紹詳細(xì),對(duì)我們學(xué)習(xí)JavaSEI有一定的幫助,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2021-12-12
  • 詳解SpringBoot中自定義和配置攔截器的方法

    詳解SpringBoot中自定義和配置攔截器的方法

    今天這篇文章來(lái)介紹一下攔截器在SpringBoot中的如何自定義及如何配置的,攔截器的具體作用和應(yīng)用場(chǎng)景,感興趣的小伙伴可以了解一下
    2022-05-05
  • Java 數(shù)據(jù)結(jié)構(gòu)進(jìn)階二叉樹(shù)題集上

    Java 數(shù)據(jù)結(jié)構(gòu)進(jìn)階二叉樹(shù)題集上

    二叉樹(shù)可以簡(jiǎn)單理解為對(duì)于一個(gè)節(jié)點(diǎn)來(lái)說(shuō),最多擁有一個(gè)上級(jí)節(jié)點(diǎn),同時(shí)最多具備左右兩個(gè)下級(jí)節(jié)點(diǎn)的數(shù)據(jù)結(jié)構(gòu)。本文將帶你通過(guò)實(shí)際題目來(lái)熟練掌握
    2022-04-04
  • list轉(zhuǎn)tree和list中查找某節(jié)點(diǎn)下的所有數(shù)據(jù)操作

    list轉(zhuǎn)tree和list中查找某節(jié)點(diǎn)下的所有數(shù)據(jù)操作

    這篇文章主要介紹了list轉(zhuǎn)tree和list中查找某節(jié)點(diǎn)下的所有數(shù)據(jù)操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-09-09
  • Sharding-JDBC讀寫(xiě)分離如何配置?主從數(shù)據(jù)庫(kù)實(shí)現(xiàn)詳解

    Sharding-JDBC讀寫(xiě)分離如何配置?主從數(shù)據(jù)庫(kù)實(shí)現(xiàn)詳解

    想知道如何用Sharding-JDBC實(shí)現(xiàn)數(shù)據(jù)庫(kù)讀寫(xiě)分離嗎?本文深入淺出地解析了主從架構(gòu)的原理,教你通過(guò)一主多從配置將讀操作路由到從庫(kù)、寫(xiě)操作路由到主庫(kù),從而大幅提升系統(tǒng)查詢性能,還介紹了如何結(jié)合分庫(kù)分表,讓?xiě)?yīng)用透明地使用集群,保證數(shù)據(jù)一致性
    2026-07-07
  • spring如何集成cxf實(shí)現(xiàn)webservice接口功能詳解

    spring如何集成cxf實(shí)現(xiàn)webservice接口功能詳解

    這篇文章主要給大家介紹了關(guān)于spring如何集成cxf實(shí)現(xiàn)webservice接口功能的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家 的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起看看吧
    2018-07-07
  • Quarkus集成open api接口使用swagger ui展示

    Quarkus集成open api接口使用swagger ui展示

    這篇文章主要為大家介紹了Quarkus集成open?api接口使用swagger?ui的展示示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步
    2022-02-02

最新評(píng)論

孝昌县| 建湖县| 会同县| 阳谷县| 静安区| 双辽市| 安宁市| 固始县| 宁蒗| 刚察县| 永年县| 张家界市| 于都县| 石柱| 南丰县| 麟游县| 奉新县| 尼勒克县| 肥城市| 龙门县| 噶尔县| 西乌珠穆沁旗| 衡水市| 上虞市| 罗源县| 茂名市| 上饶县| 肥东县| 衢州市| 文成县| 东乌珠穆沁旗| 贺州市| 德清县| 安图县| 五常市| 大荔县| 嵩明县| 洮南市| 金塔县| 富民县| 正镶白旗|