Maven 處理依賴沖突

Maven處理依賴沖突

  • 什么是依賴沖突?
  • 如何解決?
    • Maven自動處理依賴沖突的規則
      • 路徑優先原則
      • 第一聲明優先原則
        • 注意
      • 子模塊覆蓋父模塊
        • 父模塊聲明dependency子模塊覆蓋dependency
        • 父模塊聲明dependencyManagement 子模塊覆蓋dependency
        • 父模塊聲明dependencyManagement 子模塊覆蓋dependencyManagement
    • Maven手動處理依賴沖突
      • Maven自動處理依賴后導致引入了低版本的依賴
        • 解決方案
          • exclusions
          • optional
        • 注意
    • 工具

什么是依賴沖突?

當項目中直接或者間接的引入多個版本的同一依賴時則會出現依賴沖突

如何解決?

Maven自動處理依賴沖突的規則

路徑優先原則

當依賴沖突發生時,Maven 會優先選擇路徑最短的依賴版本。路徑長度是指從當前項目到依賴的層級深度。例如:項目直接引入的a:v1,及b:v1,但b:v1中引入了a:v2。那么項目自動會引入a:v1。因為a:v1b:v1->a:v2 路徑更短

實例:package-b 引入了 logback.1.5.14,及package-a 但是,package->a 引入了 logback.1.5.13。直接maven 選擇了logback.1.5.14 符合路徑優先原則

第一聲明優先原則

如果兩個依賴的路徑長度相同,Maven 會優先選擇在 pom.xml 文件中先聲明的依賴版本。例如:項目直接引入了a:v1->b:v1,與a:v2->b:v2 但是a:v1是在a:v2前先聲明的,那么就會選擇a:v2中的b:v1 反之選擇b:v2

注意

坑!!!!
直接在pom.xml中引入兩個相同坐標但不同版本的依賴時,不會按照聲明優先原則選擇。而是使用最后聲明的依賴。

[WARNING] 'dependencies.dependency.(groupId:artifactId:type:classifier)' must be unique: ch.qos.logback:logback-core:jar -> version 1.5.14 vs 1.5.13 @ line 23, column 21->表示同一個pom下不能聲明相同的坐標。這就導致maven直接選擇了最后聲明的依賴

子模塊覆蓋父模塊

子模塊可以通過在自己的 pom.xml 文件中直接聲明依賴的版本來覆蓋父模塊的版本。Maven 的依賴解析規則會優先考慮子模塊中直接聲明的依賴版本。

父模塊聲明dependency子模塊覆蓋dependency

父模塊聲明dependencyManagement 子模塊覆蓋dependency

父模塊聲明dependencyManagement 子模塊覆蓋dependencyManagement

Maven手動處理依賴沖突

Maven自動處理依賴后導致引入了低版本的依賴

package-g:1.0,package-g:2.0。通常我們是使用高版本的包,但是因為路徑優先原則,導致使用了低版本的依賴。這種就需要手動解決了。

解決方案

思路:通常我們高版本的依賴兼容低版本的依賴。那么我只需要依賴高版本的依賴即可。

exclusions

使用于不能修改package-h內部的場景

<dependencies><dependency><groupId>com.mfyuan</groupId><artifactId>package-j</artifactId><version>1.0-SNAPSHOT</version></dependency><dependency><groupId>com.mfyuan</groupId><artifactId>package-h</artifactId><version>1.0-SNAPSHOT</version><exclusions><exclusion><groupId>com.mfyuan</groupId><artifactId>package-g</artifactId></exclusion></exclusions></dependency></dependencies>

將低版本的依賴通過exclusion給排除掉即可。這樣就沒有發生依賴沖突了。

optional

optionaltrue時,不將該依賴傳遞給外層。這樣就可以避免造成依賴沖突的問題。
適用場景:可以修改package-h內部的pom.xml一般都為自己開發的jar包

<dependencies><dependency><groupId>com.mfyuan</groupId><artifactId>pacage-g</artifactId><version>1.0-SNAPSHOT</version><!--不將該依賴傳遞給外層--><optional>true</optional></dependency>
</dependencies>

注意

高版本如果沒有兼容低版本怎么辦?這種情況會造成編譯失敗,或者ClassNotFoundException如果你又需要高版本的功能也需要低版本的功能那么這種問題是解決不了的。

工具

idea插件:Maven Helper

可以快速查看那些依賴存在沖突

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

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

相關文章

docker 安裝 sqlserver2022 和注意點

一、前言 1、可以直接參考微軟官方文檔 快速入門&#xff1a;使用 Docker 運行 SQL Server Linux 容器映像&#xff0c;這里主要是說一些注意點和坑 二、安裝 1、拉取鏡像 docker pull mcr.microsoft.com/mssql/server:2022-latest2、創建掛載目錄&#xff0c;這里只是比官方…

Dagster Pipes系列-1:調用外部Python腳本

本文是"Dagster Pipes教程"的第一部分&#xff0c;介紹如何通過Dagster資產調用外部Python腳本并集成到數據管道中。首先&#xff0c;創建Dagster資產subprocess_asset&#xff0c;利用PipesSubprocessClient資源執行外部腳本external_code.py&#xff0c;實現跨進程…

【SQL系列】多表關聯更新

&#x1f49d;&#x1f49d;&#x1f49d;歡迎來到我的博客&#xff0c;很高興能夠在這里和您見面&#xff01;希望您在這里可以感受到一份輕松愉快的氛圍&#xff0c;不僅可以獲得有趣的內容和知識&#xff0c;也可以暢所欲言、分享您的想法和見解。 推薦:kwan 的首頁,持續學…

C++進階學習:STL常用容器--map/multimap容器

1. map 容器基本概念 map 中所有元素都是 pair pair 中第一個元素為 key &#xff08;鍵值&#xff09; 起到索引運用 第二個元素為 value&#xff08;實值&#xff09; 所有元素都會根據元素的鍵值自動排序 本質&#xff1a; map/multimap 屬于關聯式容器 底層結構是用二…

let,const,var關鍵字的區別

let,const,var關鍵字 let&#xff0c;const&#xff0c;var都存在變量提升 它們都存在變量提升但是稍微有點不同 var變量聲明會被提升到作用域的頂部&#xff0c;并且會被初始化為 undefinedlet 和 const&#xff1a;變量聲明也會被提升到作用域的頂部&#xff0c;但不會被初…

Nuitka 已經不再安全? Nuitka/Cython 打包應用逆向工具 -- pymodhook

pymodhook是一個記錄任意對Python模塊的調用的庫&#xff0c;用于Python逆向分析。 pymodhook庫類似于Android的xposed框架&#xff0c;但不僅能記錄函數的調用參數和返回值&#xff0c;還能記錄模塊的類的任意方法調用&#xff0c;以及任意派生對象的訪問&#xff0c;基于pyob…

path環境變量滿了如何處理,分割 PATH 到 Path1 和 Path2

要正確設置 Path1 的值&#xff0c;你需要將現有的 PATH 環境變量 中的部分路徑復制到 Path1 和 Path2 中。以下是詳細步驟&#xff1a; 步驟 1&#xff1a;獲取當前 PATH 的值 打開環境變量窗口&#xff1a; 按 Win R&#xff0c;輸入 sysdm.cpl&#xff0c;點擊 確定。在 系…

SEMI E40-0200 STANDARD FOR PROCESSING MANAGEMENT(加工管理標準)-(一)

1 目的 物料(例如晶圓)加工在設備中的自動化管理與控制是實現工廠自動化的關鍵要素。本標準針對半導體制造環境中與設備內部物料處理相關的通信需求進行了規范。本標準規定了在加工單元接收到的指定材料所應適用的加工方法(例如Etch腔室需要Run哪支Recipe)。它闡述了物料加工的…

【Hadoop】集群搭建實戰:超詳細保姆級教程

&#x1f407;明明跟你說過&#xff1a;個人主頁 &#x1f3c5;個人專欄&#xff1a;《大數據前沿&#xff1a;技術與應用并進》&#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目錄 一、引言 1、Hadoop簡介 2、Hadoop集群概念 3、 Hadoop 集…

阿里云人工智能大模型通義千問Qwen3開發部署

本文主要描述阿里云人工智能大模型開源社區ModelScope提供的通義千問Qwen3開發部署。 與阿里云一起 輕松實現數智化 讓算力成為公共服務&#xff1a;用大規模的通用計算&#xff0c;幫助客戶做從前不能做的事情&#xff0c;做從前做不到的規模。讓數據成為生產資料&#xff1a;…

24.(vue3.x+vite)引入組件并動態掛載(mount)

示例截圖 組件代碼: <template><div><div>{{message }}</div>

《Python星球日記》 第56天:循環神經網絡(RNN)入門

名人說:路漫漫其修遠兮,吾將上下而求索。—— 屈原《離騷》 創作者:Code_流蘇(CSDN)(一個喜歡古詩詞和編程的Coder??) 目錄 一、序列數據的特點與挑戰1. 什么是序列數據?2. 序列數據的挑戰二、RNN 的基本結構與前向傳播1. RNN的核心理念2. RNN的數學表達3. RNN的前向傳…

手寫 vue 源碼 === computed 實現

目錄 計算屬性的基本概念 計算屬性的核心實現 ComputedRefImpl 類的實現 ReactiveEffect 與計算屬性的關系 計算屬性的工作流程 1. 創建計算屬性 2. 依賴收集過程 3. 嵌套 effect 的處理 4. 更新過程 嵌套 effect 關系圖解 依賴關系建立過程 代碼實現分析 1. 創建…

【Lattice FPGA 開發】Diamond在線調試Reveal邏輯亂跳的解決

在Vivado中在always塊中寫邏輯時如果出現always塊中的異步復位敏感詞在塊內部未使用的情況&#xff0c;如下例的rst&#xff1a; always (posedge clk or posedge rst) begin if(~tx_sense_flag)o_rd_adr < d1;else if((o_rd_adr d94) & (bit_cnt d7))o_rd_adr <…

【hadoop】Sqoop數據遷移工具的安裝部署

一、Sqoop安裝與配置 步驟&#xff1a; 1、使用XFTP將Sqoop安裝包sqoop-1.4.6.bin__hadoop-2.0.4-alpha.tar.gz發送到master機器的主目錄。 2、解壓安裝包&#xff1a; tar -zxvf ~/sqoop-1.4.6.bin__hadoop-2.0.4-alpha.tar.gz 3、修改文件夾的名字&#xff0c;將其改為s…

BUUCTF——PYWebsite

BUUCTF——PYWebsite 進入靶場 看看基本信息 沒有什么信息 掃個目錄看看 http://node5.buuoj.cn:28115/.DS_Store http://node5.buuoj.cn:28115/flag.php http://node5.buuoj.cn:28115/index.html訪問flag.php 提示保存購買者的IP 抓包看看 直接XFF偽造一下 X-Forwarded-F…

基于Qt開發的多線程TCP服務端

目錄 一、Qt TCP服務端開發環境準備1. 項目配置2. 核心類說明二、服務端搭建步驟詳解步驟1:初始化服務端對象步驟2:啟動端口監聽步驟3:處理客戶端連接三、數據通信與狀態管理1. 數據收發實現2. 客戶端狀態監控四、進階功能擴展1. 多客戶端并發處理2. 心跳檢測機制五、調試與…

【Tools】VScode使用CMake構建項目

這里寫目錄標題 vscode 使用 CMake**安裝插件**新建CMake項目 vscode 使用 CMake 安裝插件 CMake和CMake Tools c等等 CMake插件主要功能是CMake語法高亮、自動補全CMake Tools的功能主要是結合VSCode IDE使用CMake這個工具&#xff0c;比如生成CMake項目、構建CMake項目等…

neo4j圖數據庫基本概念和向量使用

一.節點 1.新建節點 create (n:GroupProduct {name:都邦高保額團意險,description: "保險產品名稱"} ) return n CREATE&#xff1a;Neo4j 的關鍵字&#xff0c;用于創建新節點或關系。 (n:GroupProduct)&#xff1a; n 是節點的臨時別名&#xff08;變量名&#…

2025年滲透測試面試題總結-滲透測試紅隊面試八(題目+回答)

網絡安全領域各種資源&#xff0c;學習文檔&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各種好玩的項目及好用的工具&#xff0c;歡迎關注。 目錄 滲透測試紅隊面試八 二百一十一、常見中間件解析漏洞利用方式 二百一十二、MySQL用戶密碼存儲與加密 …