Maven 依賴排查

先從項目去看顯而易見,假如我們有一個項目,父工程中包含一些子工程,如下:

我們想看一下samples-account中的依賴關系,那么我們可以打開?samples-account的pom文件,查看其maven依賴關系圖。

我們可以看到此項目中maven的依賴關系如下。

?我們可以看到有很多紅色的虛線和紅色的實線,對于紅色實線來說表示的是maven依賴沖突,對于紅色虛線來說表示的是重復依賴或者是依賴被覆蓋。

因為很亂,我們可以先按如下操作找到哪些有問題的依賴關系。

然后再找到我們要關注的依賴進行分析,如我們要看spring-context-support相關的依賴是否有沖突。我們可以左鍵單擊選中這個節點,然后點擊如下按鈕:

?會自動關注到此依賴,如下圖:

這樣我們可以看到?spring-context-support 有倆版本,且samples-account直接引用過其1.0.5版本,dubbo-config-spring也引用過其1.0.5,dubbo則引用的是他的1.0.11版本(在這里由于就近原則,它的版本被改為1.0.5版本了)。我們從maven樹中也能看到:

?那么jar包后面的omitted for conflict with 1.0.5是什么意思呢?

在 Maven 的依賴樹中,當你看到“omitted for conflict with 1.0.5”這樣的信息時,它意味著 Maven 在解析依賴時遇到了版本沖突,并決定省略(排除)了與指定版本(在此例中為 1.0.5)沖突的那個依賴。

具體來說,Maven 遵循了一套復雜的依賴解析算法,稱為“最近者勝”(nearest wins)策略。當 Maven 檢測到多個庫都依賴了同一個庫的不同版本時,它會根據依賴樹中的層次結構和聲明的順序來決定使用哪個版本。在這個過程中,如果一個依賴被其他依賴以更高的版本或相同的版本引入,那么 Maven 可能會選擇忽略(省略)那個較低版本的依賴。

例如,假設你有以下依賴結構:

  • 項目 A 依賴庫 B 1.0.0
  • 庫 B 1.0.0 依賴庫 C 1.0.0
  • 項目 A 同時直接依賴庫 C 1.0.5

在這種情況下,Maven 會選擇庫 C 的 1.0.5 版本,因為這是一個更直接的依賴,并且版本號更高。同時,它會將庫 B 1.0.0 依賴的庫 C 1.0.0 標記為“omitted for conflict with 1.0.5”,意味著它已經被省略了,以避免版本沖突。

如果你希望明確控制依賴的版本,你可以在項目的?pom.xml?文件中使用?<dependencyManagement>?部分來管理依賴的版本,或者使用?<exclusions>?標簽來排除不需要的傳遞性依賴。

而omitted for duplicate又是什么意思呢?

?在Maven中,"omitted for duplicate"意味著存在多個具有相同groupIdartifactId的依賴項,但它們的版本不同或傳遞依賴路徑不同,因此Maven或相關的構建工具(如IntelliJ IDEA)認為這些依賴是重復的。

具體來說,當Maven解析項目的依賴關系時,如果它發現兩個或多個依賴項指向了同一個庫(即相同的groupIdartifactId),但它們的版本不同,Maven就會嘗試解決這種沖突。Maven的依賴調解機制會選擇一個版本作為“贏家”,并將其他版本標記為“輸家”。被標記為“輸家”的依賴項在依賴樹中可能就會被標記為"omitted for duplicate",表示它們因為與另一個相同但版本不同的依賴項沖突而被省略。

這種情況通常發生在項目的依賴關系比較復雜,特別是當項目直接或間接地通過傳遞依賴引入了同一個庫的不同版本時。為了避免這種問題,可以在項目的pom.xml文件中使用<dependencyManagement>部分來管理依賴的版本,或者使用<exclusions>標簽來排除不需要的傳遞性依賴。

?omitted for conflict with 和 omitted for duplicate有什么區別呢?

在Maven依賴管理的上下文中,omitted for conflict with?和?omitted for duplicate?這兩個術語都與解決依賴沖突有關,但它們在描述沖突的原因和結果時略有不同。

  1. omitted for duplicate

    • 這通常表示在項目的依賴樹中存在多個具有相同groupIdartifactId但可能不同版本的依賴項。Maven的依賴管理策略在處理這些依賴時,會選擇一個版本(通常是最新版本,但也取決于依賴的聲明順序和范圍),而將其他版本視為“重復的”并省略它們。
    • 當你在Maven的輸出或日志中看到“omitted for duplicate”時,這通常意味著Maven已經自動解決了這個沖突,并選擇了其中一個依賴項版本。
  2. omitted for conflict with

    • 這個術語更具體地指出了哪個依賴項與當前考慮的依賴項存在沖突。它表明,盡管兩個依賴項在groupIdartifactId上匹配,但由于某種原因(例如,它們的版本不兼容或與其他依賴項存在沖突),Maven選擇了省略其中一個。
    • “conflict with”后面通常會跟著與當前依賴項存在沖突的依賴項的詳細信息,如版本號或groupId:artifactId組合。
    • 與“omitted for duplicate”不同,“omitted for conflict with”可能意味著需要手動干預來解決沖突,特別是當Maven的自動依賴管理策略不能提供一個滿意的解決方案時。

總之,這兩個術語都涉及Maven在構建項目時如何處理依賴沖突,但“omitted for duplicate”更側重于描述多個相同依賴項的存在,而“omitted for conflict with”則更具體地指出了哪個依賴項與當前依賴項存在沖突。

對于這些沖突我們怎么解決呢?

假設你的項目(我們稱之為project-A)依賴于兩個庫:library-Xlibrary-Y

  1. library-X?的版本1.0是你的項目直接依賴的。
  2. library-Y?是你的項目直接依賴的另一個庫,但它又間接地依賴于library-X的版本2.0(作為它的傳遞性依賴)。

在Maven的依賴管理中,這會導致一個沖突,因為你的項目試圖同時使用library-X的兩個不同版本:1.0(直接依賴)和2.0(通過library-Y的傳遞性依賴)。

Maven的依賴樹可能看起來像這樣

project-A  
|-- library-X:1.0 (直接依賴)  
|-- library-Y:some-version  |-- library-X:2.0 (傳遞性依賴)

在這個例子中,Maven會嘗試解決這個沖突。默認情況下,Maven會選擇路徑最短的依賴版本,也就是說,它會盡可能地使用直接聲明的依賴版本。但是,這并不總是可行的,特別是當兩個版本在API或行為上有不兼容的更改的時候。

當然還有項目依賴是這樣沖突的:

1.projectA依賴LibraryB,LibraryB又依賴LibraryX1.0。

2.projectA依賴LibraryC,LibraryC又依賴LibraryX2.0。

ProjectA
|-- LibraryB|-- LibraryX1.0
|-- LibraryC|-- LibraryX2.0

要解決上述Maven依賴沖突問題,你可以通過在項目的pom.xml文件中配置<exclusions>標簽來排除不需要的依賴版本。以下是一個示例配置,展示了如何排除LibraryB中的LibraryX?1.0版本依賴,以確保ProjectA只使用LibraryX的2.0版本(假設這是你想要保留的版本):

<project>  ...  <dependencies>  <!-- ProjectA依賴于LibraryB -->  <dependency>  <groupId>com.example</groupId>  <artifactId>LibraryB</artifactId>  <version>1.0</version>  <exclusions>  <!-- 排除LibraryB中的LibraryX 1.0版本 -->  <exclusion>  <groupId>com.some.othergroup</groupId>  <artifactId>LibraryX</artifactId>  </exclusion>  </exclusions>  </dependency>  <!-- ProjectA也依賴于LibraryC -->  <dependency>  <groupId>com.example</groupId>  <artifactId>LibraryC</artifactId>  <version>x.y.z</version>  <!-- 注意:這里不需要排除LibraryX,因為我們要保留的版本就是LibraryC所依賴的版本 -->  </dependency>  <!-- 直接指定LibraryX的2.0版本 -->  <dependency>  <groupId>com.some.othergroup</groupId>  <artifactId>LibraryX</artifactId>  <version>2.0</version>  </dependency>  <!-- 其他依賴... -->  </dependencies>  ...  
</project>

看著好像有那么點道理,然而,在上面的配置中,直接指定LibraryX的2.0版本可能會引發另一個問題:如果LibraryB確實需要LibraryX的1.0版本來正常工作,那么這種硬編碼的依賴可能會導致LibraryB無法正常工作。

因此,更好的做法可能是確保LibraryBLibraryC維護者都更新他們的依賴項以使用兼容的版本,或者在項目的dependencyManagement部分統一指定一個兼容的版本(把問題提給項目的維護者吧)。

<project>  ...  <dependencyManagement>  <dependencies>  <!-- 統一指定LibraryX的版本為2.0 -->  <dependency>  <groupId>com.some.othergroup</groupId>  <artifactId>LibraryX</artifactId>  <version>2.0</version>  </dependency>  <!-- 其他依賴管理... -->  </dependencies>  </dependencyManagement>  <dependencies>  <!-- ProjectA依賴于LibraryB,但不需要顯式排除LibraryX,因為dependencyManagement已經指定了版本 -->  <dependency>  <groupId>com.example</groupId>  <artifactId>LibraryB</artifactId>  <version>1.0</version>  </dependency>  <!-- ProjectA也依賴于LibraryC,同樣不需要顯式排除 -->  <dependency>  <groupId>com.example</groupId>  <artifactId>LibraryC</artifactId>  <version>x.y.z</version>  </dependency>  <!-- 通常情況下,不需要直接指定LibraryX的版本,因為dependencyManagement已經處理了 -->  <!-- 其他依賴... -->  </dependencies>  ...  
</project>

?在dependencyManagement部分指定的版本將作為項目的“首選”版本,Maven將嘗試解析所有依賴以使用這個版本(除非在dependencies部分明確指定了不同的版本)。

具體依賴可參照這位博主的描述:maven依賴傳遞(直接、間接依賴)、解決依賴沖突(排除依賴、版本鎖定dependencyManagement)_maven 間接依賴-CSDN博客

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/13371.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/13371.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/13371.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Java測試框架:分享常用的Java測試框架,如JUnit, TestNG等,包括單元測試,集成測試,性能測試等

單元測試框架 JUnit JUnit簡介 JUnit是一個開源的Java測試框架,用于編寫和執行可重復的測試。它是Java開發人員的一個重要工具,用于進行單元測試、回歸測試和模塊化測試。JUnit提供了一種形式化的方式來編寫測試用例,并通過這些測試用例核實代碼的正確性。具有可預測的測試…

ARM 交叉編譯搭建SSH

一、源碼下載 zlib&#xff1a;zlib-1.3.1.tar.xz openssl&#xff1a;openssl-0.9.8d.tar.gz openssh&#xff1a;openssh-4.6p1.tar.gz 二、交叉編譯 1、zlib 編譯參考這里 2、openssl tar -xf openssl-0.9.8d.tar.gz ./Configure --prefix/opt/ssh/openssl os/compile…

android設計模式-builder模式

builder模式可以看成是鏈式調用&#xff0c;如&#xff0c;是builder不是那個bunder new AlertDialog.Builder(this) .setTitle("對話框") .setMessage("測試") .setIcon(R.mipmap.ic_launcher) …

2024年抖店保證金交多少?保證金常見問題解答,一文解決你所有疑惑

大家好&#xff0c;我是電商花花 新手如果想要開抖音小店&#xff0c;有一個大坑是必須要避開的。 就是我們店鋪開通之后&#xff0c;我們一定要交保證金&#xff0c;如果不交&#xff0c;那就是0元開店。 很多新手聽別人說做抖音小店可以0元開店&#xff0c;不用繳納保證金就…

Voronoi路徑規劃探索

系列文章目錄 提示:這里可以添加系列文章的所有文章的目錄,目錄需要自己手動添加 TODO:寫完再整理 文章目錄 系列文章目錄前言Voronoi圖的生成與更新Voronoi路徑規劃探索2.維諾圖Voronoi的生成--避障路徑Voronoi Planner一、生成與更新代價地圖costmap的方式二、生成與更新D…

開箱機選型“避坑”指南:風險識別與應對策略一網打盡

在現代化生產線上&#xff0c;開箱機作為關鍵設備之一&#xff0c;其選型過程的成功與否直接關系到生產效率與成本控制。然而&#xff0c;在選型過程中&#xff0c;往往會面臨諸多風險&#xff0c;如何有效識別并應對這些風險&#xff0c;成為企業關注的焦點。星派將為您詳細解…

JETBRAINS IDES 分享一個2099通用試用碼!DataGrip 2024 版 ,支持一鍵升級

文章目錄 廢話不多說上教程&#xff1a;&#xff08;動畫教程 圖文教程&#xff09;一、動畫教程激活 與 升級&#xff08;至最新版本&#xff09; 二、圖文教程 &#xff08;推薦&#xff09;Stage 1.下載安裝 toolbox-app&#xff08;全家桶管理工具&#xff09;Stage 2 : 下…

[解決方法]echarts地圖/圖表縮放,側邊欄導致樣式自適應問題

&#x1f50e;嘿&#xff0c;這里是慰慰&#x1f469;&#x1f3fb;?&#x1f393;&#xff0c;會發各種類型的文章&#xff0c;智能專業&#xff0c;從事前端&#x1f43e; &#x1f389;如果有幫助的話&#xff0c;就點個贊叭&#xff0c;讓我開心一下&#xff01;&#x1f…

百度Comate插件領50京東E卡

給你分享一個AI編碼助手——百度Comate&#xff01;掃碼參與抽紅包活動&#xff0c;520寵粉&#xff01;送京東卡&#xff01;https://url.xffjs.com/sMsP7m 流程如下 點擊&#xff1a;點我傳送 驗證碼登錄賬戶 點擊個人中心 復制License 去idea或者vscode安裝插件 詢問一…

Mysql的語句執行很慢,如何分析呢?

想象一下&#xff0c;MySQL像是一本巨大的電子相冊&#xff0c;里面存放著各種照片&#xff08;數據&#xff09;。當你想要找某張照片時&#xff0c;如果相冊沒有整理&#xff0c;你可能需要一張張翻看&#xff0c;這自然就慢了。但如果你給相冊里的照片分了類&#xff0c;貼上…

【Redis】Redis 主從集群(二)

1.哨兵機制原理 1.1.三個定時任務 Sentinel 維護著三個定時任務以監測 Redis 節點及其它 Sentinel 節點的狀態 1&#xff09;info 任務&#xff1a;每個 Sentinel 節點每 10 秒就會向 Redis 集群中的每個節點發送 info 命令&#xff0c;以獲得最新的 Redis 拓撲結構 2&#xff…

RabbitMQ的基本組件有哪些?

RabbitMQ的基本組件有哪些&#xff1f; RabbitMQ介紹、解耦、提速、削峰、分發 詳解、RabbitMQ安裝 可視化界面講解 RabbitMQ 不生產消息&#xff0c;他是消息的搬運工。 1. Producer: 消息的發布者。 2. Connection:producer/comsumer 和 Message Broker 之間的 TCP 連接。 3…

創建線程的方法(windows)

引用&#xff1a;windows程序員面試指南 windows上常用的創建線程的方法&#xff1a;CreateThread()&#xff0c;_beginthread()&#xff0c;std::thread 1.CreateThread() CreateThread 是 windows 提供的 api&#xff0c;用法如下&#xff1a; HANDLE CreateThread([in, …

JavaGUI---JavaFX---未完結

一、Java事件處理機制的應用 JavaFX&#xff1a;JavaFX是Java平臺上的一個GUI工具包&#xff0c;它提供了一些內置的事件處理機制。 Swing&#xff1a;Swing是Java平臺上的另一個GUI工具包&#xff0c;它也提供了一些內置的事件處理機制。 二、JavaFX和Swing的關鍵區別&…

20232906 2023-2024-2 《網絡與系統攻防技術》第十次作業

20232906 2023-2024-2 《網絡與系統攻防技術》第十次作業 1.實驗內容 一、SEED SQL注入攻擊與防御實驗 我們已經創建了一個Web應用程序&#xff0c;并將其托管在http://www.seedlabsqlinjection.com/&#xff08;僅在SEED Ubuntu中可訪問&#xff09;。該Web應用程序是一個簡…

算法day08

第一題 1. 兩數之和 由上述題意所知&#xff0c;本題要采用二分法的解題思路&#xff0c;二分法主要是面向有序的數組且也滿足二段性的數組&#xff0c;所謂二段性就是在一定的規則下能把該數組分成兩個部分&#xff1b; 本題注意要點&#xff1a; 1、循環結束的條件&#xff…

行為決策樹

系列文章目錄 提示:這里可以添加系列文章的所有文章的目錄,目錄需要自己手動添加 TODO:寫完再整理 文章目錄 系列文章目錄前言行為決策樹前言 認知有限,望大家多多包涵,有什么問題也希望能夠與大家多交流,共同成長! 本文先對** 行為決策樹**做個簡單的介紹,具體內容后…

從國內盲盒小程序看國外市場的發展機遇與挑戰

近年來&#xff0c;隨著國內電商市場的蓬勃發展&#xff0c;盲盒小程序作為一種新興的電商模式&#xff0c;以其獨特的購物體驗和創新的營銷策略&#xff0c;迅速贏得了廣大消費者的喜愛。然而&#xff0c;隨著國內市場逐漸趨于飽和&#xff0c;許多盲盒小程序開始尋求海外市場…

【Leetcode每日一題】 綜合練習 - 括號生成(難度??)(76)

1. 題目解析 題目鏈接&#xff1a;22. 括號生成 這個問題的理解其實相當簡單&#xff0c;只需看一下示例&#xff0c;基本就能明白其含義了。 2.算法原理 問題描述 我們需要找出所有可能的、有效的括號序列。一個有效的括號序列指的是一個僅由(和)組成的字符串&#xff0c;…