maven scope 詳解

Maven 的?scope用于定義依賴項在項目構建生命周期中的可見性和傳遞性,控制依賴在編譯、測試、運行等階段的可用性及是否被打包到最終產物中。以下是詳細解析:


?? ??一、Scope 的核心作用??

  1. ??生命周期控制??

    決定依賴在編譯、測試、運行階段的可用性。

  2. ??依賴傳遞性??

    影響依賴是否傳遞給下游模塊(如多模塊項目)。

  3. ??構建優化??

    避免冗余依賴,減少構建產物大小和潛在沖突。

📌 ??二、Scope 分類詳解??

1. ??compile(默認)??
  • ??可用階段??:編譯、測試、運行、打包

  • ??傳遞性??:傳遞到下游模塊。?

  • ??場景??:核心業務依賴(如 Spring、Jackson)。

<dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId><version>5.3.10</version><!-- 默認 compile,可省略 -->
</dependency>
2. ??provided??
  • ??可用階段??:編譯、測試,??運行時由外部提供??(如 Tomcat)

  • ??傳遞性??:不傳遞到下游模塊。

  • ??場景??:容器提供的依賴(如 Servlet API)。

<dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>4.0.1</version><scope>provided</scope>
</dependency>
3. ??runtime??
  • ??可用階段??:測試、運行,??編譯不可用??

  • ??傳遞性??:傳遞到下游模塊(下游為?runtime范圍)。

  • ??場景??:運行時才加載的依賴(如 JDBC 驅動)。

<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.33</version><scope>runtime</scope>
</dependency>
4. ??test??
  • ??可用階段??:僅測試(編譯測試代碼、運行測試)

  • ??傳遞性??:不傳遞到下游模塊。

  • ??場景??:測試框架(如 JUnit、Mockito)。

<dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter</artifactId><version>5.9.3</version><scope>test</scope>
</dependency>
5. ??system(不推薦)??
  • ??可用階段??:編譯、測試,需手動指定本地路徑

  • ??傳遞性??:不傳遞到下游模塊。

  • ??風險??:破壞 Maven 可移植性(依賴本地文件路徑)。

<dependency><groupId>com.example</groupId><artifactId>custom-lib</artifactId><version>1.0</version><scope>system</scope><systemPath>${project.basedir}/libs/custom-lib.jar</systemPath>
</dependency>
6. ??import(僅用于 BOM 管理)??
  • ??作用??:在?<dependencyManagement>中導入其他 POM 的依賴配置,統一版本管理

  • ??示例??:導入 Spring Boot BOM。

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

🔄 ??三、Scope 的傳遞性規則??

??依賴范圍??

??傳遞到下游的 Scope??

??示例??

compile

compile(下游直接依賴)

A → B(compile)→ C(compile)

runtime

runtime(下游運行時依賴)

A → B(runtime)→ C(runtime)

test/provided

??不傳遞??

下游需顯式聲明依賴

📌 ??依賴沖突解決??:

  • ??就近原則??:直接依賴優先級高于間接依賴。

  • ??排除依賴??:用?<exclusions>移除沖突版本

<dependency><groupId>org.example</groupId><artifactId>example-lib</artifactId><exclusions><exclusion><groupId>conflict-group</groupId><artifactId>conflict-artifact</artifactId></exclusion></exclusions>
</dependency>

🛠? ??四、實際應用場景??

  1. ??Web 項目??

    • ??provided??:Servlet API(避免與 Tomcat 內置庫沖突)。

    • ??runtime??:數據庫驅動(編譯無需,運行需加載)

  2. ??多模塊項目??

    • 公共模塊用?provided或?optional控制依賴傳遞,避免強制下游引入

  3. ??依賴管理??

    • 通過?import導入 BOM,統一版本(如 Spring Cloud、JavaEE)


? ??五、常見問題??

  1. ??provided?vs?optional??

    1. provided??:運行環境提供,不打包。

    2. optional??:標記為可選,阻止傳遞依賴(下游可顯式引入)

  2. ?運行時 ClassNotFoundException??

    原因:provided依賴未由容器提供,或?runtime依賴未正確打包。
  3. ??何時用?system?

    盡量避免!改用私有倉庫或?mvn install安裝本地依賴

💎 ??六、最佳實踐總結??

  • ??默認??:無特殊需求用?compile

  • ??容器依賴??:provided(Servlet API 等)。

  • ??運行時加載??:runtime(JDBC 驅動)。

  • ??測試隔離??:test(JUnit)。

  • ??依賴管理??:import(BOM 導入)。

  • ??🚫 避免??:system(破壞可移植性)。

通過合理配置?scope,可顯著提升構建效率、減少沖突,并確保依賴在正確階段生效。更多細節可參考:Maven 官方文檔

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

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

相關文章

Python的一次實際應用:利用Python操作Word文檔的頁碼

Python的一次實際應用&#xff1a;利用Python操作Word文檔的頁碼 需求&#xff1a;一次性處理24個文檔的頁碼。 文檔詳情&#xff1a; 1、每個word文檔包含800頁左右&#xff0c;每一頁包含一個標題和一張圖片。 2、由于圖片有橫排也有豎排&#xff0c;因此&#xff0c;每頁文檔…

Android15 GKI版本分析Kernel Crash問題

環境介紹編譯主機&#xff1a;amd64 Ubuntu 22.04Android源碼&#xff1a;Android15 GKIKernel版本&#xff1a;Linux 6.16Android構建系統&#xff1a;bazel構建工具鏈&#xff1a;gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu-定位Linux…

rocky 9部署Zabbix監控

一、rocky安裝 需要注意在設置root用戶密碼時&#xff0c;勾選ssh遠程連接 安裝完成后直接用root登錄 1. 網絡配置 輸入nmtui 進入網絡配置界面 選擇 Edit a connection&#xff0c;再選擇接口 ens3 IPV4更改為Maual 手動模式 根據實際環境配置IP地址 重啟網絡 systemctl …

從9.4%到13.5%:ICDM2025錄取率觸底反彈,競爭壓力稍緩

近日&#xff0c;ICDM 2025公布了論文錄用結果。本次大會共收到785篇有效論文投稿&#xff0c;最終&#xff0c;共有106篇常規論文和70篇短論文被接收&#xff0c;總體接收率為22.4%&#xff0c;其中全文論文的接收率為13.5%。與前年9.4%、去年11.09%的錄取率相比&#xff0c;I…

linux上安裝methylkit -- 安全下車版 (正經版: Linux環境下安裝methylKit的實踐與避坑指南)

題外話&#xff1a; 我踩過的坑&#xff0c;都將成為我寫貼的素材&#xff01;(ㄒoㄒ) 整整安裝了兩天&#xff0c;這里面的滋味懂的都懂。 希望開發作者持續維護。 希望有人或者作者持續打包成sigularity鏡像使用&#xff0c;并且直接傳到github上&#xff0c;傳到docker上下…

【leetcode】114. 二叉樹展開為鏈表

文章目錄題目題解1. 遞歸2. 迭代3. 右指針重排&#xff0c;始終將右子樹添加到左子樹的最右題目 114. 二叉樹展開為鏈表 題解 1. 遞歸 先序遍歷然后將數組操作 for i in range(1, len(res)):prev, curr res[i - 1], res[i]prev.left Noneprev.right curr# Definition fo…

Vibe Coding、AI IDE/插件

概述 Vibe Coding&#xff0c;氛圍編程&#xff0c;AI輔助編程&#xff0c;三劍客&#xff1a; Google Gemini&#xff1a;OpenAI GPT&#xff1a;Anthropic Claude&#xff1a; IDE Cursor 基于VS Code開發。 特性&#xff1a; AI驅動的代碼生成&#xff1a;輸入想要的…

Unity高級UI拖動控制器教程

在游戲開發過程中&#xff0c;UI組件的拖動功能是一個常見的需求。特別是在需要實現拖動、邊界檢測、透明度控制以及動畫反饋等功能時&#xff0c;編寫一個高級UI拖動控制器將非常有用。在本文中&#xff0c;我們將創建一個支持多種Canvas模式和更精確邊界檢測的高級UI拖動控制…

零基礎上手:Cursor + MCP 爬取 YouTube 視頻數據

前言 大模型與 AI 應用越來越普及的今天&#xff0c;實時、穩定地獲取網絡數據變得尤為重要。無論是做內容分析、趨勢研究還是自動化任務&#xff0c;爬取和處理數據始終是繞不開的一環。 傳統爬蟲往往面臨封禁、驗證碼、動態渲染等難題&#xff0c;而 Bright Data MCP&#x…

frp 一個高性能的反向代理服務

文章目錄項目概述核心特性系統架構快速開始1. 下載安裝2. 服務端快速配置3. 客戶端快速配置4. 驗證連接配置文件說明代理類型TCP/UDP 代理HTTP/HTTPS 代理安全代理 (STCP/SUDP)P2P 代理 (XTCP)插件系統靜態文件服務HTTP/SOCKS5 代理協議轉換使用場景遠程辦公Web 服務發布游戲服…

Android -第二十一次技術總結

一、activity與Fragment的通信有哪些&#xff1f;使用接口進行通信的邏輯與代碼示例使用接口通信的核心是解耦&#xff0c;通過定義一個接口作為通信契約&#xff0c;讓 Fragment 不依賴于具體的 Activity 類型。1. 定義通信接口&#xff08;在 Fragment 內&#xff09;首先&am…

【算法】78.子集--通俗講解

通俗易懂講解“子集”算法題目 一、題目是啥?一句話說清 給你一個不含重復元素的整數數組,返回所有可能的子集(包括空集和它本身)。 示例: 輸入:nums = [1,2,3] 輸出:[[], [1], [2], [1,2], [3], [1,3], [2,3], [1,2,3]] 二、解題核心 使用回溯法(遞歸)或位運算來…

Cherrystudio的搭建和使用

1、下載和安裝 Cherry Studio 官方網站 - 全能的 AI 助手 2、配置LLM 3、聊天助手 3.1 添加和編輯助手 3.2 選擇LLM 3.3 對話聊天 4、配置MCP 4.1 安裝MCP執行插件 4.2 安裝 node和npm Node.js — Download Node.js npm -v 10.9.3 node -v v22…

基于Matlab結合膚色檢測與卷積神經網絡的人臉識別方法研究

近年來&#xff0c;隨著人工智能與計算機視覺技術的發展&#xff0c;人臉識別在人機交互、安防監控、身份認證等領域得到了廣泛應用。本文提出了一種基于 MATLAB 平臺&#xff0c;結合 膚色檢測與卷積神經網絡&#xff08;CNN&#xff09; 的人臉識別方法。該方法首先利用膚色模…

在八月點燃AI智慧之火:CSDN創作之星挑戰賽開啟靈感盛宴

在八月點燃AI智慧之火&#xff1a;CSDN創作之星挑戰賽開啟靈感盛宴八月驕陽似火&#xff0c;智能時代的技術熱情同樣熾熱。在這個充滿創新活力的季節&#xff0c;「AIcoding八月創作之星挑戰賽」正式拉開帷幕&#xff0c;為CSDN的創作者們打造一個展示才華、碰撞靈感的專業舞臺…

解密 Vue 3 shallowRef:淺層響應式 vs 深度響應式的性能對決

&#x1f4d6; 概述 shallowRef() 是 Vue 3 中的一個組合式 API 函數&#xff0c;用于創建淺層響應式引用。與 ref() 不同&#xff0c;shallowRef() 只在其 .value 被直接替換時觸發響應式更新&#xff0c;不會深度監聽對象內部屬性的變化。 &#x1f3af; 基本概念 什么是 sh…

Linux進程間通信(IPC)深入解析

Linux進程間通信&#xff08;IPC&#xff09;深入解析 1 概述 Linux 進程間通信 (Inter-Process Communication, IPC) 是不同進程之間交換數據與同步操作的機制。現代 Linux 內核提供了多種 IPC 方式&#xff0c;從傳統的管道和 System V IPC 到現代的套接字和 D-Bus&#xff0…

TensorFlow-GPU版本安裝

前言&#xff1a; &#xff08;1&#xff09;因項目需求&#xff0c;需要安裝TensorFlow-GPU版本&#xff0c;故本文在此記錄安裝過程。 &#xff08;2&#xff09;有注釋&#xff0c;優先看注釋 &#xff08;3&#xff09;本文所使用的GPU為NVIDIA GeForce RTX 5080 Laptop GP…

Elasticsearch 索引字段刪除,除了 Reindex 重建索引還有沒有別的解決方案?

unsetunset1、問題來源unsetunset在生產環境維護 Elasticsearch 集群的過程中&#xff0c;經常會遇到這樣的場景&#xff1a;業務需求變更導致某些字段不再使用&#xff0c;或者早期設計時添加了一些冗余字段&#xff0c;現在需要清理掉。最近球友在公司的一個項目中就遇到了這…

Ubuntu虛擬機磁盤空間擴展指南

這是一份詳細且易于理解的 Ubuntu 虛擬機磁盤空間擴展指南。本指南涵蓋了兩種主流虛擬機軟件&#xff08;VirtualBox 和 VMware&#xff09;的操作步驟&#xff0c;并分為 “擴展虛擬磁盤” 和 “在 Ubuntu 內部分配新空間” 兩大部分。重要提示&#xff1a;在進行任何磁盤操作…