Maven - 依賴的生命周期詳解

作者:唐叔在學習
專欄:唐叔的Java實踐
標簽:Maven依賴管理、Java項目構建、依賴傳遞性、Spring Boot依賴、Maven最佳實踐、項目構建工具、依賴沖突解決、POM文件詳解

文章目錄

    • 一、開篇
    • 二、Maven依賴生命周期
      • 2.1 依賴聲明階段:POM文件的藝術
      • 2.2 依賴解析階段:Maven倉庫的尋寶游戲
      • 2.3 依賴傳遞性:你的依賴的依賴的依賴...
      • 2.4 依賴范圍(Scope):不同階段的不同需求
      • 2.5 依賴調解:當沖突不可避免時...
    • 三、高級技巧
      • 3.1 BOM管理:統一版本的神器
      • 3.2 可選依賴(optional)與排除依賴(exclusion)
      • 3.3 依賴分類標簽
    • 四、總結

一、開篇

各位CSDN的小伙伴們好,我是你們的老朋友唐叔!今天咱們來聊聊Java開發中那個讓人又愛又恨的家伙——Maven。作為Apache旗下的頂級項目,Maven早已成為Java生態中不可或缺的構建工具。據最新統計,超過78%的Java項目都在使用Maven進行依賴管理!

但很多小伙伴對Maven的依賴機制一知半解,經常遇到諸如:

  • “明明加了依賴,為什么ClassNotFound?”
  • “這個jar包哪來的?我的pom里沒聲明啊!”
  • “為什么本地運行正常,打包就報錯?”

今天唐叔就帶大家徹底搞懂Maven依賴的生命周期,讓你從此告別依賴地獄!

二、Maven依賴生命周期

2.1 依賴聲明階段:POM文件的藝術

在Maven的世界里,一切依賴都始于pom.xml。這個看似簡單的XML文件,實則暗藏玄機。來看個Spring Boot項目的經典依賴聲明:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><version>2.7.0</version><scope>compile</scope>
</dependency>

這里包含四個關鍵要素:

  1. groupId:組織標識(如org.springframework.boot)
  2. artifactId:項目標識(如spring-boot-starter-web)
  3. version:版本號(強烈建議使用明確版本)
  4. scope:依賴范圍(compile/runtime/test等)

唐叔小貼士:現在流行用Spring Boot的starter系列,它們其實是精心設計的"依賴包套餐",比如spring-boot-starter-web就自動包含了Spring MVC、Tomcat等常用組件。

2.2 依賴解析階段:Maven倉庫的尋寶游戲

當你執行mvn compile時,Maven會開啟一場跨越本地倉庫、中央倉庫、私服的尋寶之旅:

  1. 本地倉庫:默認在~/.m2/repository,優先查找
  2. 中央倉庫:repo.maven.apache.org,Maven官方維護
  3. 私服倉庫:公司內部搭建的Nexus/Artifactory
  4. 鏡像倉庫:阿里云等提供的國內鏡像(推薦配置)
未找到
項目POM
本地倉庫
遠程倉庫
中央倉庫
私服倉庫
鏡像倉庫

熱點SEO技巧:國內開發者強烈建議配置阿里云鏡像,速度提升10倍不止!在settings.xml中加入:

<mirror><id>aliyunmaven</id><mirrorOf>*</mirrorOf><name>阿里云公共倉庫</name><url>https://maven.aliyun.com/repository/public</url>
</mirror>

2.3 依賴傳遞性:你的依賴的依賴的依賴…

這是Maven最強大的特性,也是最容易出問題的點!比如你引入了spring-boot-starter-web,它會自動帶來:

  • spring-boot-starter
  • spring-core
  • jackson-databind
  • tomcat-embed-core
  • …(共20+個傳遞依賴)

唐叔劃重點:可以用mvn dependency:tree查看完整的依賴樹,這是排查沖突的利器!

2.4 依賴范圍(Scope):不同階段的不同需求

Maven定義了6種依賴范圍,掌握它們能顯著優化構建:

Scope編譯期測試期運行期典型示例
compilespring-core
provided×servlet-api
runtime×JDBC驅動
test××JUnit
system×本地系統路徑的JAR
import---dependencyManagement

實戰場景:開發Spring Boot應用時,打包成可執行JAR不需要包含Tomcat(因為內嵌了),但如果是WAR包部署到外部Tomcat,就需要把Tomcat依賴設為provided。

2.5 依賴調解:當沖突不可避免時…

當多個傳遞依賴引入不同版本時,Maven有兩個調解原則:

  1. 最短路徑優先:A→B→C→D(1.0) vs A→E→D(2.0) → 選擇D(2.0)
  2. 先聲明優先:在pom中先聲明的依賴優先

沖突解決方案

<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.13.1</version><exclusions><exclusion><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-annotations</artifactId></exclusion></exclusions>
</dependency>

三、高級技巧

3.1 BOM管理:統一版本的神器

Spring Cloud等大型項目都采用BOM(Bill of Materials)管理依賴版本:

<dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>2021.0.3</version><type>pom</type><scope>import</scope></dependency></dependencies>
</dependencyManagement>

3.2 可選依賴(optional)與排除依賴(exclusion)

  • optional=true:表示該依賴不會被傳遞
  • exclusion:主動排除特定的傳遞依賴

3.3 依賴分類標簽

<dependencies><!-- 核心功能 --><dependency>...</dependency><!-- 數據庫相關 --><dependency>...</dependency><!-- 測試相關 --><dependency>...</dependency>
</dependencies>

四、總結

  1. 明確聲明:盡量指定版本號,避免使用LATEST
  2. 善用dependencyManagement:多模塊項目統一管理版本
  3. 定期檢查依賴:mvn dependency:analyze發現無用依賴
  4. 理解傳遞性:dependency:tree是最好用的調試工具
  5. 合理使用Scope:優化最終打包內容
  6. 擁抱BOM:大型項目版本管理必備

唐叔最后送大家一句話:"好的依賴管理就像好的城市規劃,既要四通八達,又要避免擁堵混亂。"希望這篇文章能幫你成為Maven依賴管理的高手!

思考題:你們項目中有沒有遇到過奇葩的依賴沖突?是怎么解決的?歡迎在評論區分享你的故事!

覺得有幫助的小伙伴別忘了點贊收藏!點擊關注唐叔,每周解鎖Java干貨!


相關maven文章推薦

? Maven - 并行安全無重復打包構建原理揭秘
? Maven BOM機制 - Maven復雜依賴關系管理“神器“
? IDEA 多線程打包 Maven 模塊:讓你的構建速度飛起來!

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

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

相關文章

從零打造大語言模型--處理文本數據

從零打造大語言模型 第 1 章&#xff1a;處理文本數據 章節導讀 在把文本投喂進 Transformer 之前&#xff0c;需要兩步&#xff1a;① 將字符流切分成離散 Token&#xff1b;② 把 Token 映射成連續向量。 1.1 理解詞嵌入&#xff08;Word Embedding&#xff09; 嵌入向量 一…

【Spring】Bean的生命周期,部分源碼解釋

文章目錄Bean 的生命周期執行流程代碼演示執行結果源碼閱讀AbstractAutowireCapableBeanFactorydoCreateBeaninitializeBeanBean 的生命周期 生命周期指的是一個對象從誕生到銷毀的整個生命過程&#xff0c;我們把這個過程就叫做一個對象的聲明周期 Bean 的聲明周期分為以下 …

[spring-cloud: 服務發現]-源碼解析

DiscoveryClient DiscoveryClient 接口定義了常見的服務發現操作&#xff0c;如獲取服務實例、獲取所有服務ID、驗證客戶端可用性等&#xff0c;通常用于 Eureka 或 Consul 等服務發現框架。 public interface DiscoveryClient extends Ordered {/*** Default order of the dis…

QML 基礎語法與對象模型

QML (Qt Meta-Object Language) 是一種聲明式語言&#xff0c;專為創建流暢的用戶界面和應用程序邏輯而設計。作為 Qt 框架的一部分&#xff0c;QML 提供了簡潔、直觀的語法來描述 UI 組件及其交互方式。本文將深入解析 QML 的基礎語法和對象模型。 一、QML 基礎語法 1. 基本對…

HTTPS的概念和工作過程

一.HTTPS是什么HTTPS也是一個應用層協議&#xff0c;是在HTTP協議的基礎上引入了一個加密層&#xff08;SSL&#xff09;HTTP協議內容都是按照文本的方式明文傳輸的&#xff0c;這就導致傳輸過程中可能出現被篡改的情況最著名的就是十多年前網絡剛發展的時期&#xff0c;出現“…

Unity —— Android 應用構建與發布?

文章目錄1 ?Gradle模板??&#xff1a;了解Gradle模板的作用及使用方法&#xff0c;以增強對構建流程的控制。?2 ?Gradle模板變量??&#xff1a;參考文檔——自定義Gradle模板文件中可用的變量列表。2.1 修改Unity應用的Gradle工程文件2.1.1 通過Gradle模板文件2.1.2 導出…

【iOS】strong和copy工作流程探尋、OC屬性關鍵字復習

文章目錄前言strong和copy的區別為什么要用copy&#xff1f;什么時候用什么修飾&#xff1f;strong&#xff08;ARC自動管理&#xff09;strong修飾變量的底層流程圖底層代碼核心實現小結copy底層流程圖對比與strong的關鍵不同之處內部調用關系&#xff08;偽代碼&#xff09;小…

程序代碼篇---多循環串口程序切換

上位機版&#xff08;Python&#xff09;要實現根據串口接收結果高效切換四個 while 循環函數&#xff0c;我們可以采用狀態機模式&#xff0c;配合非阻塞串口讀取來設計程序結構。這種方式可以實現快速切換&#xff0c;避免不必要的資源消耗。下面是一個高效的實現方案&#x…

rk3568上,實現ota,計算hash,驗證簽名,判斷激活分區,并通過dd命令,寫入對應AB分區

通過自定義升級程序&#xff0c;更直觀的理解ota升級原理。 一、模擬計算hash&#xff0c;驗證簽名&#xff0c;判斷激活分區&#xff0c;并通過dd命令&#xff0c;寫入對應分區 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <u…

數據分析—numpy庫

numpy庫NumPy 庫全面指南NumPy (Numerical Python) 是 Python 科學計算的基礎庫&#xff0c;提供了高性能的多維數組對象和工具。以下是 NumPy 的核心功能和使用方法。一、安裝與基礎1. 安裝 NumPypip install numpy2. 導入 NumPyimport numpy as np # 標準導入方式二、數組創建…

Vue3 setup、ref和reactive函數

一、setup函數1.理解&#xff1a;Vue3.0中一個新的配置項&#xff0c;值為一個函數。2.setup是所有Composition API(組合API)的“表演舞臺”。3.組件中用到的&#xff1a;數據、方法等等&#xff0c;均要配置在setup中。4.setup函數的兩種返回值&#xff1a;(1).若返回一個對象…

python中appium 的NoSuchElementException錯誤 原因以及解決辦法

錯誤收集D:\Program\Util\python.exe "D:/Program/myUtil/PyCharm 2024.3.5/plugins/python-ce/helpers/pycharm/_jb_pytest_runner.py" --target demo.py::TestAppium Testing started at 15:57 ... Launching pytest with arguments demo.py::TestAppium --no-hea…

mybatis-plus從入門到入土(四):持久層接口之BaseMapper和選裝件

大家好&#xff0c;今天繼續更新MybatisPlus從入門到入土系列&#xff0c;上一次的持久層接口還沒講完&#xff0c;只講了IService接口&#xff0c;今天我們繼續來講一下。 BaseMapper BaseMapper中的方法也比較簡單&#xff0c;都是增刪改查的基礎API&#xff0c;不知道大家還…

數組和指針的關系

在 C 語言中&#xff0c;?指針和數組有著非常緊密的聯系&#xff0c;但它們本質上是 ?不同的概念。理解它們的關系是掌握 C 語言內存操作的關鍵。下面我會從多個角度幫你梳理 ?指針和數組的直接聯系&#xff0c;并解釋它們的異同點。1. 數組和指針的本質區別?概念本質存儲方…

AI大模型探索之路-實戰篇:智能化IT領域搜索引擎之github網站在線搜索

系列篇章?? No. 文章 1 AI大模型探索之路-實戰篇:智能化IT領域搜索引擎的構建與初步實踐 2 AI大模型探索之路-實戰篇:智能化IT領域搜索引擎之GLM-4大模型技術的實踐探索 3 AI大模型探索之路-實戰篇:智能化IT領域搜索引擎之知乎網站數據獲取(初步實踐) 4 AI大模型探索之路…

從0到1學PHP(十二):PHP 框架入門與項目實戰

目錄一、主流 PHP 框架介紹1.1 Laravel1.2 ThinkPHP1.3 Yii1.4 框架的優勢二、框架基本使用&#xff08;以 Laravel 為例&#xff09;2.1 框架的安裝與配置2.2 路由定義、控制器創建、視圖渲染2.3 數據庫操作&#xff08;ORM 的使用&#xff09;三、小型項目實戰3.1 項目需求分…

MPLS LSP

一、概述上一章我們已經介紹過,LSP是MPLS報文在MPLS網絡中轉發時經過的路徑,可以看作是由報文傳輸方向節點為對應FEC分配的MPLS入標簽組成的,因為每臺設備上為每個FEC分配的入標簽是唯一 的&#xff0c;并與由下游節點為本地節點上該FEC分配的出標簽建立映射關系&#xff0c; 所…

圖像、視頻、音頻多模態大模型中長上下文token壓縮方法綜述

多模態大模型MLLMs 能夠處理高分辨率圖像、長視頻序列和冗長音頻輸入等復雜上下文&#xff0c;但自注意力機制的二次復雜度使得大量輸入 token 帶來了巨大的計算和內存需求。 如下圖&#xff0c;上&#xff1a;圖像、視頻和音頻數據類型可以在其表示維度上進行擴展&#xff0c;…

Spring MVC 九大組件源碼深度剖析(一):MultipartResolver - 文件上傳的幕后指揮官

文章目錄一、為什么從 MultipartResolver 開始&#xff1f;二、核心接口&#xff1a;定義文件上傳的契約三、實現解析&#xff1a;兩種策略的源碼較量1. StandardServletMultipartResolver&#xff08;Servlet 3.0 首選&#xff09;2. CommonsMultipartResolver&#xff08;兼容…

stm32是如何實現電源控制的?

STM32的電源控制主要通過內置的電源管理模塊&#xff08;PWR&#xff09;實現&#xff0c;涵蓋電壓調節、功耗模式切換和電源監控等功能。以下是其核心機制及實現方式&#xff1a;??1. 電源架構與供電區域??STM32的電源系統分為多個供電區域&#xff0c;各司其職&#xff1…