深入理解Maven BOM

一、什么是Maven BOM?

1.1 BOM的基本概念

Maven BOM(Bill of Materials,材料清單)是一種特殊的POM文件,它主要用于集中管理多個相關依賴的版本。BOM本身不包含任何實際代碼,而是作為一個 版本管理的"參考清單",確保項目中使用的各種依賴保持版本兼容性。

1.2 BOM的核心作用

  • 版本一致性:確保項目中的所有相關依賴使用相互兼容的版本
  • 簡化配置:減少在各個子模塊中重復定義依賴版本的工作
  • 集中管理:版本升級只需修改BOM文件一處即可全局生效
  • 沖突解決:有效避免依賴版本沖突問題

1.3 BOM的典型應用場景

表:BOM常見使用場景

場景說明示例
框架整合管理框架相關組件的兼容版本Spring Boot BOM
微服務架構統一服務間依賴版本Spring Cloud BOM
企業級開發統一公司內部組件版本公司內部平臺BOM
多模塊項目協調模塊間依賴關系大型項目內部BOM

二、如何定義BOM?

2.1 創建BOM項目的基本結構

創建一個標準的BOM項目需要遵循特定的結構:

my-project-bom/
├── pom.xml

其中pom.xml的關鍵配置如下:

<project><modelVersion>4.0.0</modelVersion><groupId>com.example</groupId><artifactId>my-project-bom</artifactId><version>1.0.0</version><packaging>pom</packaging> <!-- 必須為pom類型 --><dependencyManagement><dependencies><!-- 在這里定義需要管理的依賴 --><dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId><version>5.3.8</version></dependency><!-- 更多依賴... --></dependencies></dependencyManagement>
</project>

2.2 BOM定義的關鍵要素

  1. packaging類型:必須設置為pom
  2. dependencyManagement:所有依賴版本定義必須放在此部分
  3. 版本號:為每個依賴明確指定版本號
  4. 作用域:通常不需要指定scope(除非特殊需求)

2.3 高級BOM定義技巧

2.3.1 繼承已有BOM
<dependencyManagement><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>2.5.4</version><type>pom</type><scope>import</scope></dependency><!-- 可以添加自己的依賴覆蓋或補充 --></dependencies>
</dependencyManagement>
2.3.2 使用屬性管理版本
<properties><spring.version>5.3.8</spring.version>
</properties><dependencyManagement><dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId><version>${spring.version}</version></dependency></dependencies>
</dependencyManagement>

2.4 BOM發布與使用

  1. 使用mvn deploy發布BOM到倉庫
  2. 在其他項目中引用:
<dependencyManagement><dependencies><dependency><groupId>com.example</groupId><artifactId>my-project-bom</artifactId><version>1.0.0</version><type>pom</type><scope>import</scope></dependency></dependencies>
</dependencyManagement>

三、如何區分BOM依賴?

3.1 識別BOM的特征指標

  1. 命名特征

    • artifactId通常包含-dependencies-bom后綴
    • spring-boot-dependenciesspring-cloud-dependencies-bom
  2. 打包類型

    • 在POM文件中必定有<packaging>pom</packaging>
  3. 內容特征

    • 主要包含<dependencyManagement>部分
    • 幾乎沒有實際<dependencies>定義
  4. 引用方式

    • 使用時帶有<type>pom</type><scope>import</scope>

3.2 實際識別方法

方法一:查看POM文件內容
# 下載依賴的POM文件查看
mvn dependency:get -Dartifact=org.springframework.cloud:spring-cloud-dependencies:2021.0.3:pom -Ddest=./temp.pom

檢查下載的POM文件是否主要是<dependencyManagement>內容。

方法二:Maven命令驗證
# 檢查依賴是否會出現在依賴樹中
mvn dependency:tree -Dincludes=org.springframework.cloud:spring-cloud-dependencies

如果是BOM,通常不會出現在依賴樹中。

3.3 常見BOM示例

表:主流框架的BOM示例

框架BOM坐標典型版本
Spring Bootorg.springframework.boot:spring-boot-dependencies2.7.0
Spring Cloudorg.springframework.cloud:spring-cloud-dependencies2021.0.3
Jakarta EEjakarta.platform:jakarta.jakartaee-api9.1.0
Apache Camelorg.apache.camel:camel-bom3.18.0

四、BOM與parent標簽的區別

4.1 核心區別對比

通過import引入
繼承
BOM
依賴版本管理
Parent
完整POM配置
僅影響依賴版本
影響整個項目配置

表:BOM與parent標簽功能對比

特性BOMParent
繼承關系無繼承,通過import引入父子繼承關系
作用范圍僅管理依賴版本管理整個POM配置
數量限制可導入多個BOM只能有一個父POM
覆蓋能力導入后不能覆蓋子POM可覆蓋父配置
配置內容只有dependencyManagement完整POM配置
靈活性較低

4.2 適用場景分析

使用BOM更適合:
  1. 需要組合多個來源的依賴管理
  2. 項目已有父POM但需要額外版本管理
  3. 作為第三方庫提供版本管理
  4. 需要更靈活的依賴管理方式
使用Parent更適合:
  1. 公司內部項目統一基礎配置
  2. 需要統一插件管理、資源過濾等非依賴配置
  3. 有明確的父子項目層次結構
  4. 需要繼承通用構建配置

4.3 組合使用的最佳實踐

現代項目通常會結合使用parent和BOM:

<!-- 1. 繼承公司基礎配置 -->
<parent><groupId>com.company</groupId><artifactId>company-base-parent</artifactId><version>1.0.0</version>
</parent><!-- 2. 導入框架BOM -->
<dependencyManagement><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>2.7.0</version><type>pom</type><scope>import</scope></dependency></dependencies>
</dependencyManagement><!-- 3. 項目自身依賴 -->
<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><!-- 無需版本號,由BOM管理 --></dependency>
</dependencies>

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

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

相關文章

Mysql分頁:高效處理海量數據的核心技術

Mysql分頁&#xff1a;高效處理海量數據的核心技術01 引言 在Web應用、移動應用或數據分析場景中&#xff0c;數據庫常常需要處理百萬甚至千萬級的數據記錄。一次性加載所有數據不僅效率低下&#xff0c;還會消耗大量網絡帶寬和內存資源。數據庫分頁技術正是解決這一挑戰的關鍵…

通過 Docker 運行 Prometheus 入門

Promethues 組件 prometheus serverexporteralertmanager 環境準備 Docker 拉取鏡像備用 # https://hub.docker.com/r/prom/prometheus docker pull m.daocloud.io/docker.io/prom/prometheus:main# https://hub.docker.com/r/prom/node-exporter docker pull m.daocloud.io/do…

Java 8特性(一)

目錄 一、Lambda表達式 1、語法格式&#xff1a; &#xff08;1&#xff09;接口名 對象名(參數類型1參數名1,....參數類型n 參數名n)->{方法體;} &#xff08;2&#xff09;參數類型h 參數名n:接口中抽象方法的參數項 &#xff08;3&#xff09;->:表示連接操作 &a…

【代碼隨想錄|232.用棧實現隊列、225.用隊列實現棧、20.有效的括號、1047.刪除字符串中的所有相鄰重復項】

232.用棧實現隊列 timutimtit232. 用棧實現隊列 - 力扣&#xff08;LeetCode&#xff09; class MyQueue { public:stack<int> Sin;stack<int> Sout;MyQueue() {}void push(int x) {Sin.push(x);}int pop() {if (Sout.empty()) { // 出棧為空就把入棧的數導出來w…

碼上爬第三題【協程+瀏覽器調試檢測】

前言&#xff1a;圖靈第三題就是對用戶瀏覽器調試檢測&#xff0c;檢測鼠標右擊打開控制臺&#xff0c;檢測鍵盤按鍵ctrlshifti&#xff0c;從瀏覽器設置打開開發者工具也不行&#xff0c;應該是有瀏覽器寬高檢測的&#xff0c;所以我們保證瀏覽器頁面寬高不變即可。你如果想右…

windows、linux應急響應入侵排查

windows入侵排查 1.1檢查賬號 1.查看服務器是否有弱口令&#xff0c;遠程管理端口是否對公網開放 2.查看服務器是否存在可疑賬號、新增賬號 檢查方法&#xff1a;打開 cmd 窗口&#xff0c;輸入 lusrmgr.msc 命令&#xff0c;查看是否有新增/可疑的賬號&#xff0c;如有管…

11. 為什么要用static關鍵字

11. 為什么要用static關鍵字 static&#xff1a;通常來說&#xff1a;在new一個對象的時候&#xff0c;數據存儲空間才會被分配&#xff0c;方法才能被外界使用。但是有時只想單獨分配一個存儲空間&#xff0c;不考慮需要創建對象或不創建對象&#xff0c;在沒有對象的情況下也…

[Oracle] MAX()和MIN()函數

MAX() 和 MIN() 是 Oracle 常用的聚合函數&#xff0c;用于從一組值中找出最大值和最小值1.MAX()函數MAX()函數返回指定列或表達式中的最大值語法格式MAX(expression)參數說明expression&#xff1a;可以是列名、計算列或表達式示例-- 返回employees表中salary列的最大值 SELEC…

網絡資源模板--基于Android Studio 實現的麻雀筆記App

目錄 一、測試環境說明 二、項目簡介 三、項目演示 四、部設計詳情&#xff08;部分) 添加頁面 五、項目源碼 一、測試環境說明 電腦環境 Windows 11 編寫語言 JAVA 開發軟件 Android Studio (2020) 開發軟件只要大于等于測試版本即可(近幾年官網直接下載也可以)&…

96-基于Flask的酷狗音樂數據可視化分析系統

基于Flask的酷狗音樂數據可視化分析系統 &#x1f4cb; 目錄 項目概述技術棧系統架構功能特性數據庫設計核心代碼實現數據可視化部署指南項目總結 &#x1f3af; 項目概述 本項目是一個基于Flask框架開發的酷狗音樂數據可視化分析系統&#xff0c;旨在為用戶提供音樂數據的…

Java基礎-紅包雨游戲-多線程

目錄 案例要求&#xff1a; 實現思路&#xff1a; 代碼&#xff1a; Employee RedPacket RedPacketRain 總結&#xff1a; 案例要求&#xff1a; 實現思路&#xff1a; 創建一個員工類,id和搶到的金額&#xff0c;創建一個紅包類&#xff0c;里面就是金額&#xff0c;創…

[激光原理與應用-203]:光學器件 - 增益晶體 - 增益晶體的使用方法

增益晶體是激光器的核心元件&#xff0c;其作用是通過受激輻射放大光信號。正確使用增益晶體需綜合考慮晶體選型、光路設計、熱管理、泵浦方式及安全防護等關鍵環節。以下是增益晶體的詳細使用方法及注意事項&#xff1a;一、晶體選型&#xff1a;根據需求匹配參數材料選擇Nd:Y…

?什么是抽象主義人工智能??

什么是抽象主義人工智能&#xff1f; 傳統的人工智能分為符號主義和連接主義兩個派別&#xff0c;后來又增加了行為主義。 我發現符號主義和連接主義處理的都是文本&#xff0c;而不是語義。原來的專家系統是符號主義的產物。現在的大語言模型是連接主義的產物。它們處理的都…

OpenSpeedy綠色免費版下載,提升下載速度,網盤下載速度等游戲變速工具

下載地址獲取點擊這里打開&#xff1a;OpenSpeedy 簡單介紹OpenSpeedy 是一款開源免費的游戲變速工具&#xff08;對某些網盤或者其他的一些下載也可進行加速&#xff09;&#xff0c;讓你的游戲突破幀率限制&#xff0c;提供更流暢絲滑的游戲加速體驗。1、完全免費且開源2、簡…

Windows 電腦遠程訪問,ZeroTier 實現內網穿透完整指南(含原理講解)

&#x1f9ed; 一、目標場景說明 想從安卓移動端遠程到Windows電腦 實現如下效果&#xff1a; 家中 Windows 電腦開機聯網&#xff1b;安卓手機/平板在外地&#xff0c;只要聯網就能遠程控制電腦桌面&#xff1b;不需要公網 IP&#xff0c;不用設置端口映射&#xff1b;免費…

解決本地連接服務器ollama的錯誤

1. 服務器 ollama 安裝 $ curl -fsSL https://ollama.com/install.sh | sh >>> Cleaning up old version at /usr/local/lib/ollama >>> Installing ollama to /usr/local >>> Downloading Linux amd64 bundle ##################################…

詳解Windows(十四)——PowerShell與命令提示符

詳解Windows&#xff08;十四&#xff09;——PowerShell與命令提示符 一、Windows命令行工具概述 1. 什么是命令行界面(CLI) 命令行界面&#xff0c;簡稱CLI&#xff08;Command Line Interface&#xff09;&#xff0c;是一種通過輸入文字命令來操作電腦的方式。與我們熟悉…

Spring源碼解析 - SpringApplication 屬性-初始化initializers, listeners -Spring提供的鉤子函數

初始化源碼 public SpringApplication(ResourceLoader resourceLoader, Class<?>... primarySources) {~~~setInitializers((Collection) getSpringFactoriesInstances(ApplicationContextInitializer.class));setListeners((Collection) getSpringFactoriesInstances(A…

簡單聊聊PowerShell

1、powershell和cmdpowershell簡單來說也是一個控制終端&#xff0c;他也經常拿出來和windows自帶的CMD來進行對比。windows系統一般來說這兩者都是自帶的。雖然cmd平時大家用的最多&#xff0c;但他是非常古老的&#xff0c;可以用來執行簡單的批處理文件&#xff0c;如.bat等…

Spring系列之Spring AI入門

概述 GitHub&#xff0c;官網&#xff0c;目前最新版是1.0.1。 功能&#xff1a; 跨AI提供商的可移植API&#xff1a;用于聊天、文本到圖像和嵌入模型。支持同步和流API選項。還支持下拉訪問模型特定功能。跨Vector Store提供商的可移植API&#xff0c;包括同樣可移植的新穎…