Maven之依賴管理

Maven之依賴管理

    • 一、Maven依賴管理的核心價值
    • 二、依賴的基本配置(坐標與范圍)
      • 2.1 依賴坐標(GAV)
      • 2.2 依賴范圍(scope)
        • 示例:常用依賴范圍配置
    • 三、依賴傳遞與沖突解決
      • 3.1 依賴傳遞性
        • 示例:依賴傳遞
      • 3.2 依賴沖突及解決
        • 3.2.1 沖突的表現
        • 3.2.2 Maven默認的沖突調解規則
        • 示例:路徑最近原則
        • 示例:聲明優先原則
        • 3.2.3 手動解決沖突(排除與鎖定)
          • 方式1:排除依賴(exclusions)
          • 方式2:鎖定版本(dependencyManagement)
    • 三、依賴管理的高級配置
      • 3.1 可選依賴(optional)
      • 3.2 導入依賴(import)
      • 3.3 快照依賴(SNAPSHOT)
    • 四、實戰:依賴管理最佳實踐
      • 4.1 單模塊項目依賴管理
      • 4.2 多模塊項目依賴管理
        • 1. 父模塊pom.xml(parent.pom)
        • 2. 子模塊pom.xml(module-web/pom.xml)
    • 四、常見問題與避坑指南
      • 4.1 依賴下載失敗(Could not find artifact)
      • 4.2 國內鏡像配置(解決下載慢問題)
      • 4.3 依賴范圍使用不當
    • 總結:依賴管理的核心要點

Java項目開發中手動管理jar包是一件繁瑣且容易出錯的工作(如版本沖突、缺失依賴),Maven的依賴管理功能通過標準化的配置,自動下載、存儲和管理jar包,極大提升了開發效率。

一、Maven依賴管理的核心價值

在沒有Maven的時代,開發者需要手動下載jar包、放入項目lib目錄,并處理jar包之間的依賴關系(如使用Spring需要同時導入commons-logging)。這種方式的問題:

  • 版本混亂:同一jar包可能有多個版本,手動選擇易出錯;
  • 依賴缺失:復雜框架(如Spring Boot)依賴數十個jar包,手動收集困難;
  • 冗余存儲:每個項目都保存一份jar包,浪費磁盤空間;
  • 升級困難:升級框架版本需手動替換所有相關jar包。

Maven的依賴管理通過以下方式解決這些問題:

  1. 中央倉庫:統一存儲jar包,自動下載并緩存到本地倉庫;
  2. 依賴坐標:通過groupId+artifactId+version唯一標識jar包;
  3. 依賴傳遞:自動引入間接依賴(如導入Spring-core會自動引入commons-logging);
  4. 沖突解決:提供默認的依賴調解規則,避免版本沖突。

二、依賴的基本配置(坐標與范圍)

2.1 依賴坐標(GAV)

Maven通過GAV坐標唯一標識一個依賴(jar包),在pom.xml中配置:

<dependencies><!-- 依賴配置 --><dependency><groupId>org.springframework</groupId> <!-- 組織ID(公司/組織唯一標識) --><artifactId>spring-core</artifactId>   <!-- 項目ID(模塊唯一標識) --><version>5.3.20</version>             <!-- 版本號 --></dependency>
</dependencies>

坐標三要素

  • groupId:組織或公司標識(如org.springframework代表Spring官方);
  • artifactId:項目或模塊標識(如spring-core是Spring的核心模塊);
  • version:版本號(如5.3.20,RELEASE表示穩定版,SNAPSHOT表示快照版)。

作用:Maven根據GAV從中央倉庫下載jar包,并存儲到本地倉庫(默認~/.m2/repository)。

2.2 依賴范圍(scope)

依賴范圍控制依賴在編譯、測試、運行三個階段的可見性,常用范圍:

范圍(scope)編譯時有效測試時有效運行時有效打包時包含典型場景
compile(默認)????核心依賴(如Spring-core)
test????測試依賴(如JUnit)
provided????容器提供的依賴(如Servlet-api)
runtime????運行時依賴(如MySQL驅動)
system????本地jar包(非倉庫獲取,不推薦)
示例:常用依賴范圍配置
<dependencies><!-- 1. compile(默認):編譯、測試、運行都需要 --><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.3.20</version><!-- 省略scope,默認compile --></dependency><!-- 2. test:僅測試階段需要(如JUnit) --><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.13.2</version><scope>test</scope></dependency><!-- 3. provided:運行時由容器提供(如Tomcat提供Servlet-api) --><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>4.0.1</version><scope>provided</scope></dependency><!-- 4. runtime:編譯時不需要,運行時需要(如MySQL驅動) --><dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId><version>8.0.33</version><scope>runtime</scope></dependency>
</dependencies>

關鍵說明

  • provided依賴不會被打包(如Servlet-api,避免與Tomcat自帶的沖突);
  • test依賴僅在src/test/java中可用,主代碼無法引用。

三、依賴傳遞與沖突解決

3.1 依賴傳遞性

Maven的依賴具有傳遞性:若A依賴B,B依賴C,則A會自動依賴C(無需手動配置)。

示例:依賴傳遞
A項目依賴spring-context(5.3.20)
└── spring-context依賴spring-core(5.3.20)└── spring-core依賴commons-logging(1.2)

此時A項目的pom.xml只需配置spring-context,Maven會自動引入spring-core和commons-logging:

<dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.3.20</version>
</dependency>

優勢:簡化配置,無需手動引入間接依賴。

3.2 依賴沖突及解決

依賴傳遞可能導致同一jar包出現多個版本(如A依賴C-1.0,B依賴C-2.0),引發沖突。

3.2.1 沖突的表現
  • NoSuchMethodError:調用的方法在當前版本中不存在(如使用低版本jar包但調用高版本方法);
  • ClassNotFoundException:類不存在(版本不兼容導致);
  • 日志混亂:同一框架的不同版本日志輸出異常。
3.2.2 Maven默認的沖突調解規則

Maven提供默認規則解決沖突,優先級:

  1. 路徑最近原則:直接依賴優先于間接依賴(如A直接依賴C-2.0,同時通過B依賴C-1.0,則使用C-2.0);
  2. 聲明優先原則:路徑相同時,在pom.xml中聲明靠前的依賴優先。
示例:路徑最近原則
A依賴B(B依賴C-1.0)
A直接依賴C-2.0
→ 最終使用C-2.0(直接依賴路徑更近)
示例:聲明優先原則
A依賴B(B依賴C-1.0)
A依賴D(D依賴C-2.0)
→ 若B在pom.xml中聲明比D靠前,使用C-1.0;反之使用C-2.0
3.2.3 手動解決沖突(排除與鎖定)

默認規則可能不符合需求,需手動干預:

方式1:排除依賴(exclusions)

通過exclusions排除不需要的間接依賴:

<dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.3.20</version><!-- 排除間接依賴的commons-logging --><exclusions><exclusion><groupId>commons-logging</groupId><artifactId>commons-logging</artifactId></exclusion></exclusions>
</dependency><!-- 手動引入更高版本的日志依賴 -->
<dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>1.7.36</version>
</dependency>

適用場景:排除沖突的間接依賴,替換為其他依賴(如用SLF4J替代commons-logging)。

方式2:鎖定版本(dependencyManagement)

通過dependencyManagement統一管理版本,強制所有依賴使用指定版本:

<!-- 父pom或當前pom中配置 -->
<dependencyManagement><dependencies><!-- 鎖定Spring-core版本為5.3.20 --><dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId><version>5.3.20</version></dependency></dependencies>
</dependencyManagement><!-- 實際依賴(無需指定version,自動使用鎖定版本) -->
<dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId><!-- 版本由dependencyManagement控制 --></dependency>
</dependencies>

優勢

  • 集中管理版本,避免分散配置導致的不一致;
  • 子模塊可繼承父模塊的版本鎖定(適合多模塊項目)。

三、依賴管理的高級配置

3.1 可選依賴(optional)

若A依賴B,且B中的某些功能并非所有使用者都需要,可將B標記為optional(可選依賴),避免B被傳遞:

<!-- A項目的pom.xml -->
<dependency><groupId>com.example</groupId><artifactId>module-b</artifactId><version>1.0.0</version><optional>true</optional> <!-- 可選依賴,不傳遞 -->
</dependency>

效果:其他項目依賴A時,不會自動依賴B;若需要B,需手動配置。

3.2 導入依賴(import)

import用于導入其他pom.xml中的dependencyManagement配置(類似“引用”),適合多模塊項目統一版本:

<!-- 定義一個統一的版本管理pom(如dependency-management.pom) -->
<project><groupId>com.example</groupId><artifactId>dependency-management</artifactId><version>1.0.0</version><packaging>pom</packaging><dependencyManagement><dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId><version>5.3.20</version></dependency></dependencies></dependencyManagement>
</project><!-- 在其他項目中導入 -->
<dependencyManagement><dependencies><dependency><groupId>com.example</groupId><artifactId>dependency-management</artifactId><version>1.0.0</version><type>pom</type><scope>import</scope> <!-- 導入依賴管理配置 --></dependency></dependencies>
</dependencyManagement>

優勢:避免在每個項目中重復配置dependencyManagement,實現版本集中管控。

3.3 快照依賴(SNAPSHOT)

快照版本(version-SNAPSHOT結尾)用于開發中的臨時版本,Maven會定期更新(默認每天檢查一次):

<dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId><version>5.4.0-SNAPSHOT</version> <!-- 快照版本 -->
</dependency>

特點

  • 適合團隊內部開發(頻繁迭代,未正式發布);
  • 正式環境應使用RELEASE版本(穩定,不更新)。

四、實戰:依賴管理最佳實踐

4.1 單模塊項目依賴管理

<project><modelVersion>4.0.0</modelVersion><groupId>com.example</groupId><artifactId>single-module</artifactId><version>1.0.0</version><!-- 集中管理版本 --><properties><spring.version>5.3.20</spring.version><junit.version>4.13.2</junit.version></properties><dependencyManagement><dependencies><!-- Spring相關依賴 --><dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId><version>${spring.version}</version> <!-- 引用properties中的版本 --></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>${spring.version}</version></dependency><!-- 測試依賴 --><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>${junit.version}</version><scope>test</scope></dependency></dependencies></dependencyManagement><!-- 實際依賴(無需指定version) --><dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><scope>test</scope></dependency></dependencies>
</project>

關鍵

  • 通過properties定義版本變量,便于統一修改;
  • dependencyManagement集中管控,實際依賴簡化配置。

4.2 多模塊項目依賴管理

多模塊項目(如父模塊+子模塊)通過父模塊統一管理依賴:

1. 父模塊pom.xml(parent.pom)
<project><groupId>com.example</groupId><artifactId>parent</artifactId><version>1.0.0</version><packaging>pom</packaging> <!-- 父模塊必須為pom --><!-- 子模塊 --><modules><module>module-web</module><module>module-service</module></modules><!-- 統一版本管理 --><properties><spring.version>5.3.20</spring.version></properties><dependencyManagement><dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>${spring.version}</version></dependency></dependencies></dependencyManagement>
</project>
2. 子模塊pom.xml(module-web/pom.xml)
<project><parent><groupId>com.example</groupId><artifactId>parent</artifactId><version>1.0.0</version></parent><artifactId>module-web</artifactId><dependencies><!-- 繼承父模塊的版本,無需指定version --><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId></dependency></dependencies>
</project>

優勢

  • 所有子模塊共享父模塊的版本配置,確保一致性;
  • 升級版本只需修改父模塊,無需逐個修改子模塊。

四、常見問題與避坑指南

4.1 依賴下載失敗(Could not find artifact)

錯誤Could not find artifact org.springframework:spring-core:jar:5.3.20 in central

原因

  • 網絡問題(無法連接中央倉庫);
  • GAV坐標錯誤(如拼寫錯誤、版本不存在);
  • 本地倉庫緩存損壞(下載到一半的文件)。

解決方案

  • 檢查網絡連接,或配置國內鏡像(如阿里云倉庫);
  • 確認GAV坐標正確(可在Maven中央倉庫搜索驗證);
  • 刪除本地倉庫中對應目錄(如~/.m2/repository/org/springframework/spring-core/5.3.20),重新下載。

4.2 國內鏡像配置(解決下載慢問題)

中央倉庫在國外,下載慢可配置阿里云鏡像:

<!-- 在settings.xml中配置(~/.m2/settings.xml) -->
<settings><mirrors><mirror><id>aliyunmaven</id><name>阿里云公共倉庫</name><url>https://maven.aliyun.com/repository/public</url><mirrorOf>central</mirrorOf> <!-- 替代中央倉庫 --></mirror></mirrors>
</settings>

4.3 依賴范圍使用不當

問題provided依賴在運行時缺失(如Servlet-api在Tomcat外運行報錯)。

原因provided依賴在運行時不包含,若應用脫離容器運行(如單元測試),會找不到類。

解決方案

  • 測試時可添加test范圍的依賴:
<dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>4.0.1</version><scope>provided</scope>
</dependency>
<!-- 測試時使用 -->
<dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>4.0.1</version><scope>test</scope>
</dependency>

總結:依賴管理的核心要點

  1. 基礎配置:通過GAV坐標定義依賴,scope控制依賴范圍;
  2. 沖突解決:優先使用dependencyManagement鎖定版本,必要時通過exclusions排除沖突;
  3. 最佳實踐
    • 集中管理版本(properties+dependencyManagement);
    • 多模塊項目通過父模塊統一版本;
    • 合理使用providedtest范圍,減少打包體積;
    • 配置國內鏡像,提升下載速度。

掌握依賴管理不僅能避免版本沖突,還能提升項目的可維護性,在實際項目中觀察依賴樹(通過mvn dependency:tree命令),了解依賴傳遞關系,遇到沖突時能快速定位并解決。

若這篇內容幫到你,動動手指支持下!關注不迷路,干貨持續輸出!
ヾ(′? ˋ)ノヾ(′? ˋ)ノヾ(′? ˋ)ノヾ(′? ˋ)ノヾ(′? ˋ)ノ

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

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

相關文章

【Unity實戰100例】Unity資源下載系統開發流程詳解(移動端、PC端 ,局域網控制臺服務)

目錄 一、項目概述 二、服務器開發 1、配置文件設計 1、加載配置 2. 處理客戶端請求 3. 文件下載處理 三、客戶端開發 1、配置管理 1、配置加載與保存 2、下載任務管理 1、任務類設計 2、下載隊列管理 3、核心下載流程 四、UI系統實現 五、部署與測試 1、服務…

[Python] -進階理解7- Python中的內存管理機制簡析

Python(尤其是 CPython)采用自動內存管理機制,核心包括引用計數(Reference Counting)與垃圾回收機制(Garbage Collection),并配合專門的內存池和分配器機制來提升效率與減少碎片。 這套機制隱藏在開發者視線之外,Python 開發者無需手動申請或釋放內存。 二、Python 內…

云祺容災備份系統AWS S3對象存儲備份與恢復實操手冊

1、創建密鑰訪問AWS控制臺&#xff0c;鼠標移至右上角賬戶處&#xff0c;在彈出菜單中點擊安全憑證&#xff0c;如圖1。圖1在彈出頁面中&#xff0c;下滑找到訪問密鑰&#xff0c;并點擊創建訪問密鑰&#xff0c;如圖2。圖2選擇其他&#xff0c;并點擊下一步&#xff0c;如圖3。…

使用 LLaMA 3 8B 微調一個 Reward Model:從入門到實踐

本文將介紹如何基于 Meta 的 LLaMA 3 8B 模型構建并微調一個 Reward Model&#xff0c;它是構建 RLHF&#xff08;基于人類反饋的強化學習&#xff09;系統中的關鍵一環。我們將使用 Hugging Face 的 transformers、trl 和 peft 等庫&#xff0c;通過參數高效微調&#xff08;L…

matrix-breakout-2-morpheus靶場攻略

靶場使用將壓縮包解壓到一個文件夾中&#xff0c;用虛擬機應用新建虛擬機&#xff0c;掃描虛擬機&#xff0c;掃描那個文件夾&#xff0c;就可以把虛擬機掃出來了&#xff0c;然后啟動虛擬機這時候靶場啟動后&#xff0c;咱們現在要找到這個靶場。靶場是網頁形式的&#xff0c;…

MySQL 復制表

MySQL 復制表 概述 在數據庫管理中&#xff0c;復制表是一項常用的操作。它允許數據庫管理員將一個表中的數據復制到另一個表中&#xff0c;無論是同一個數據庫還是不同的數據庫。MySQL數據庫提供了多種方法來復制表&#xff0c;本文將詳細介紹MySQL復制表的過程、方法及其應用…

『哈哥贈書 - 55期』-『碼農職場:IT人求職就業手冊』

文章目錄?? 碼農職場&#xff1a;IT人求職就業手冊?? 本書簡介?? 作者簡介?? 編輯推薦這是一本專為廣大IT行業求職者量身定制的指南&#xff0c;提供了從職前準備到成功就業的全方位指導&#xff0c;涵蓋了職業目標規劃、自我技能評估、求職策略、簡歷準備以及職場心理…

單片機學習課程

單片機學習課程 課程介紹 單片機技術作為現代工業自動化、電子電氣、通信及物聯網等領域的主流技術&#xff0c;早已深度融入我們生活與生產的各個角落。從常見家電到自動化公共設施&#xff0c;都離不開單片機的支持。同時&#xff0c;它也是學習 ARM 嵌入式系統、FPGA 設計等…

【AcWing 143題解】最大異或對

AcWing 143. 最大異或對 【題目描述】 在查看解析之前&#xff0c;先給自己一點時間思考哦&#xff01; 【題解】 本題要求給定一個整數序列&#xff0c;找出其中任意兩個數進行異或運算后&#xff0c;結果的最大值是多少。由于數據規模較大&#xff0c;我們不能簡單地通過兩…

SQLAlchemy 2.0簡單使用

記錄一下SQLAlchemy 2.0連接mysql數據庫的方法及簡單使用 環境及依賴 Python:3.8 mysql:8.3 Flask:3.0.3 SQLAlchemy:2.0.37 PyMySQL:1.1.1使用步驟 1、創建引擎&#xff0c;鏈接到mysql engine create_engine(mysqlpymysql://{username}:{password}{ip}:3306/{database_name}…

如何創建或查看具有 repo 權限的 GitHub 個人訪問令牌(PAT)

要創建或查看具有 repo 權限的 GitHub 個人訪問令牌(PAT),請按照以下步驟操作: 一、生成具有 repo 權限的 PAT 登錄 GitHub 訪問 GitHub 官網,使用你的賬戶登錄。 進入開發者設置 點擊右上角頭像,選擇 Settings(設置) → 左側菜單中選擇 Developer settings(開發者設…

【AI時代速通QT】第五節:Qt Creator如何引入第三方庫,以OpenCV為例

目錄 引言 一、第一步&#xff1a;萬事開頭難 - 準備工作 1.1 獲取并“安裝”OpenCV 1.2 創建一個新的Qt項目 1.3 建立專業的項目目錄結構 二、第二步&#xff1a;核心操作 - 配置.pro文件 2.1 方式一&#xff1a;圖形化向導&#xff08;適合初次體驗&#xff09; 2.2 …

使用Clion開發STM32(Dap調試)

使用Clion開發STM32環境配置ST-Link無法下載OpenOCDST-Link調試Dap-Link調試Debug配置查看寄存器值之前寫了一篇文章關于如何用VSCode配合EIDE插件開發STM32 最近研究了如何使用Clion開發STM32 環境配置 使用Clion開發STM32需要用到4個工具&#xff1a;Clion、STM32CubeMX、…

人工智能-python-OpenCV 中 `release()` 和 `destroy()` 的區別

文章目錄OpenCV 中 release() 和 destroy() 的區別1. release()常見使用場景&#xff1a;代碼示例&#xff1a;作用&#xff1a;2. destroy()常見使用場景&#xff1a;代碼示例&#xff1a;作用&#xff1a;3. 總結&#xff1a;4. 何時使用小結&#xff1a;OpenCV 中 release()…

[RPA] 日期時間練習案例

案例1根據日期拆分表格根據表格中不同日期&#xff0c;創建多個對應日期名稱的Sheet頁(名稱格式為"yyyy-mm-dd")&#xff0c;并將同一日期的訂單拷貝至對應Sheet頁日期時間練習題1.xlsx流程搭建&#xff1a;實現效果&#xff1a;

2025.7.27文獻閱讀-基于深度神經網絡的半變異函數在高程數據普通克里金插值中的應用

2025.7.27周報一、文獻閱讀題目信息摘要創新點實驗一、半變異函數擬合二、普通克里金插值三、結果對比分析四、實驗結果結論不足以及展望一、文獻閱讀 題目信息 題目&#xff1a; Application of a semivariogram based on a deep neural network to Ordinary Kriging interp…

用unity開發教學輔助軟件---幼兒繪本英語拼讀

記錄完整項目的制作&#xff0c;借鑒了大佬被代碼折磨的狗子 “unity創建《找不同》游戲 圖片編輯器”一文。 &#xff08;建議通過目錄閱讀本文哦~&#xff09; 項目演示&#xff1a; 幼兒英語教輔幼兒英語繪本教學游戲整體架構 游戲開發中設計的整體框架 游戲的總體功能框架…

《Java 程序設計》第 5 章 - 數組詳解

引言在 Java 編程中&#xff0c;數組是一種基礎且重要的數據結構&#xff0c;它允許我們將多個相同類型的元素存儲在一個連續的內存空間中&#xff0c;通過索引快速訪問。掌握數組的使用是學習 Java 集合框架、算法等高級知識的基礎。本章將從數組的創建、使用開始&#xff0c;…

基于Spring Boot的可盈保險合同管理系統的設計與實現(源碼+論文)

一、相關技術 技術/工具描述SSM框架在JavaWeb開發中&#xff0c;SSM框架&#xff08;Spring Spring MVC MyBatis&#xff09;是流行的選擇。它既沒有SSH框架的臃腫&#xff0c;也沒有SpringMVC的簡化&#xff0c;屬于中間級別&#xff0c;更靈活且易于編寫和理解。MyBatis框…

??XSLT:XML轉換的“魔法棒”?

大家好&#xff01;今天我們來聊聊 ??XSLT??&#xff08;Extensible Stylesheet Language Transformations&#xff09;&#xff0c;一種用于轉換和呈現XML文檔的神奇工具。如果你曾需要將一堆枯燥的XML數據變成精美的HTML網頁、PDF報告&#xff0c;或其他XML格式&#xff…