Maven中的bom和父依賴

maven最全避坑指南寫完后,發現自己對于bom和父pom的理解還是不夠深入,特此轉載DeepSeek的回答,和大家一起學習了。

在 Maven 的依賴管理中,父 POM (Parent POM)BOM (Bill of Materials) 都是用于實現集中化管理和控制的核心機制,但它們的設計目的、工作方式和應用場景有顯著區別:

核心區別總結表

特性父 POM (Parent POM)BOM (Bill of Materials)
主要目的定義和繼承公共配置集中管理依賴版本
打包類型<packaging>pom</packaging><packaging>pom</packaging>
機制繼承 (<parent>)導入 (<scope>import)
控制范圍全局性 (構建配置、插件、依賴管理、屬性等)針對性 (僅依賴版本管理)
強制性 (子模塊自動繼承大部分配置) (項目需顯式導入才生效)
靈活性較低 (子模塊可能被迫繼承不需要的配置)較高 (項目可選擇性地導入所需 BOM)
典型內容屬性、依賴管理、插件管理、倉庫、報告配置等幾乎只有 <dependencyManagement>
適用場景緊密耦合的多模塊項目松散耦合的項目、微服務架構、第三方平臺集成

詳細解釋

  1. 父 POM (Parent POM)

    • 核心機制:繼承 (<parent> 標簽)
      • 子模塊 POM 文件通過 <parent> 元素聲明其父 POM。
      • 子模塊繼承父 POM 中定義的大部分內容:
        • <properties>:定義的屬性(如 Java 版本、編碼、依賴版本號屬性)。
        • <dependencyManagement>:依賴版本和范圍的管理(子模塊聲明依賴時不需要寫版本)。
        • <pluginManagement>:插件版本和配置的管理(子模塊聲明插件時通常不需要寫版本)。
        • <repositories> / <pluginRepositories>:倉庫配置。
        • <build> / <reporting>:構建和報告的基礎配置(如資源過濾、默認插件執行)。
        • <modules>:定義子模塊列表(只在頂級父 POM 中使用)。
    • 目的:一組緊密相關的子模塊(通常在一個多模塊項目中)提供統一的基礎配置和默認行為,確保構建一致性,減少重復配置。
    • 強制性: 強。子模塊一旦聲明了父 POM,就必須遵守父 POM 中定義的大部分規則(尤其是依賴管理和插件管理)。父 POM 像是一個“憲法”。
    • 靈活性: 相對較低。如果父 POM 定義了一個插件配置或依賴管理項,所有子模塊都會繼承它,即使某個子模塊不需要。子模塊可以覆蓋父 POM 的配置,但需謹慎。
    • 典型結構:
      <!-- 父 pom.xml -->
      <project><modelVersion>4.0.0</modelVersion><groupId>com.company</groupId><artifactId>parent-project</artifactId><version>1.0.0</version><packaging>pom</packaging> <!-- 關鍵! --><modules><module>service-a</module><module>service-b</module></modules><properties><java.version>17</java.version><spring-boot.version>3.1.0</spring-boot.version></properties><dependencyManagement><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>${spring-boot.version}</version><type>pom</type><scope>import</scope> <!-- 父POM也可以導入BOM! --></dependency><dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>32.1.2-jre</version></dependency></dependencies></dependencyManagement><build><pluginManagement><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><version>${spring-boot.version}</version></plugin><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.11.0</version><configuration><source>${java.version}</source><target>${java.version}</target></configuration></plugin></plugins></pluginManagement></build>
      </project><!-- 子模塊 pom.xml -->
      <project><modelVersion>4.0.0</modelVersion><parent><groupId>com.company</groupId><artifactId>parent-project</artifactId><version>1.0.0</version></parent><artifactId>service-a</artifactId><dependencies><dependency> <!-- 版本由父POM的dependencyManagement控制 --><groupId>com.google.guava</groupId><artifactId>guava</artifactId></dependency></dependencies><build><plugins><plugin> <!-- 版本由父POM的pluginManagement控制 --><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build>
      </project>
      
  2. BOM (Bill of Materials)

    • 核心機制:導入 (<scope>import)
      • BOM 本身是一個特殊的 POM 文件 (<packaging>pom</packaging>)。
      • 它的核心內容幾乎只有 <dependencyManagement> 部分,其中精確定義了一組相關依賴及其允許的版本
      • 其他項目(可以是獨立的項目,也可以是子模塊)在自己的 <dependencyManagement> 部分中,通過 <scope>import</scope> 導入 BOM。
    • 目的: 專門且集中地管理一組第三方依賴的兼容版本。它本身不提供構建配置、插件管理或屬性定義(雖然技術上可以放,但不推薦,違背單一職責)。它定義了一份“物料清單”。
    • 強制性: 弱。一個項目選擇導入某個 BOM,才會受到其依賴版本管理的約束。項目可以導入多個 BOM。
    • 靈活性: 高。項目可以自由選擇導入哪些 BOM(例如,核心平臺 BOM、數據庫 BOM、特定框架 BOM)。BOM 只影響依賴版本,不強制其他構建配置。
    • 典型結構:
      <!-- BOM pom.xml -->
      <project><modelVersion>4.0.0</modelVersion><groupId>com.company</groupId><artifactId>platform-bom</artifactId><version>2024.04.0</version><packaging>pom</packaging> <!-- 關鍵! --><dependencyManagement><dependencies> <!-- 核心:定義依賴和版本 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><version>3.1.0</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId><version>3.1.0</version></dependency><dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>32.1.2-jre</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.28</version><scope>provided</scope> <!-- 甚至可以在BOM中建議scope --></dependency></dependencies></dependencyManagement><!-- 通常沒有build/reporting/modules等部分 -->
      </project><!-- 使用BOM的項目 pom.xml (可以是獨立項目或子模塊) -->
      <project><modelVersion>4.0.0</modelVersion><groupId>com.company.service</groupId><artifactId>order-service</artifactId><version>1.0.0</version><dependencyManagement><dependencies><dependency> <!-- 導入BOM --><groupId>com.company</groupId><artifactId>platform-bom</artifactId><version>2024.04.0</version><type>pom</type><scope>import</scope> <!-- 關鍵!導入依賴管理 --></dependency></dependencies></dependencyManagement><dependencies><dependency> <!-- 聲明依賴,不指定版本 --><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId></dependency></dependencies><!-- 項目自身的其他配置... -->
      </project>
      

關鍵區別點強調

  1. 機制與范圍:

    • 父 POM 通過繼承傳遞廣泛的配置(依賴管理、插件管理、屬性、倉庫、構建配置等)。
    • BOM 通過導入傳遞單一的配置(依賴管理,主要是版本和 scope)。
  2. 耦合度:

    • 父 POM 創建了強耦合。子模塊必須屬于同一個父項目結構,并且繼承父的“全部遺產”(可能包含不需要的東西)。
    • BOM 創建了弱耦合。任何項目(無論是否在同一個多模塊結構中,甚至在不同倉庫中)都可以選擇導入一個或多個 BOM,僅獲取其依賴版本定義。
  3. 職責:

    • 父 POM 是項目結構的管理者,定義整個項目或一組模塊的構建基線和默認行為。
    • BOM 是依賴版本的協調者,專注于確保一組庫在一起使用時版本的兼容性和一致性。

如何選擇?結合使用!

在大型分布式系統或復雜的多模塊項目中,最佳實踐通常是結合使用兩者,發揮各自優勢:

  1. 創建頂級父 POM (可選但推薦):

    • 定義全局屬性(Java 版本、編碼、基礎屬性)。
    • 配置企業級倉庫 (<repositories>, <pluginRepositories>)。
    • 管理基礎插件的版本和配置 (<pluginManagement>)。
    • 管理非常核心、平臺級依賴的版本(如公司內部基礎庫)。
    • 聲明子模塊 (<modules>)。
  2. 創建核心 BOM (強烈推薦):

    • 集中管理所有第三方庫及其兼容版本。
    • 可以按領域創建多個 BOM(如 platform-bom, database-bom, observability-bom)。
  3. 在父 POM 中導入 BOM:

    <!-- 在父POM的dependencyManagement中 -->
    <dependencyManagement><dependencies><dependency><groupId>com.company</groupId><artifactId>platform-bom</artifactId><version>2024.04.0</version><type>pom</type><scope>import</scope> <!-- 將BOM的依賴管理導入到父POM --></dependency></dependencies>
    </dependencyManagement>
    
    • 這樣子模塊在繼承父 POM 時,自動獲得了 BOM 中定義的依賴版本控制。
    • 避免了在每個子模塊中重復導入 BOM。
  4. 在獨立項目/服務中使用 BOM:

    • 對于不在同一個父 POM 下的微服務或獨立項目,直接在它們的 <dependencyManagement> 中導入所需的 BOM。

總結:

  • 父 POM = 構建配置的繼承者 + 基礎依賴管理者 + 項目結構組織者。 用于統一緊密相關模塊的構建環境。
  • BOM = 依賴版本的權威清單。 用于跨項目(無論是否同構)統一第三方依賴版本,確保兼容性。
  • 最佳實踐: 在分布式系統中,BOM 是管理依賴版本一致性的基石。父 POM 可以作為組織多模塊項目和導入 BOM 的有效載體。兩者協同工作,共同實現高效、一致、安全的依賴管理。

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

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

相關文章

Python 操作 Word 文檔:主流庫對比與選擇指南

在辦公自動化、報告生成、數據處理等領域&#xff0c;利用 Python 程序化地創建、讀取或修改 Microsoft Word 文檔 (.docx 格式) 是一項非常實用的技能。Python 生態中有多個優秀的庫可以完成這項任務&#xff0c;但它們各有側重和優缺點。選擇哪一個“最好用”&#xff0c;關鍵…

怎么修改論文格式呢?提供一份論文格式模板

注!!!本文內容是作者自己整理的一份模板,僅供參考,各位如何修改,還需要看學校的要求。 一、參考文獻 1、有一定數量的近幾年參考文獻、不宜過多中文文獻 英文期刊模板 [1] Taesoo K, Sooyoung K, Kyunghan L, et al. Special issue on 6G and satellite communication…

MVC 發布

MVC 發布 引言 MVC(Model-View-Controller)模式是一種廣泛應用于軟件開發的架構模式。它將應用程序分為三個主要部分:模型(Model)、視圖(View)和控制器(Controller)。這種模式不僅提高了代碼的可維護性和可擴展性,而且使得開發者可以更加專注于各個組件的開發。本文…

arkui 動畫曲線

參考文檔 https://developer.huawei.com/consumer/cn/doc/harmonyos-references/js-apis-curve#curvesinterpolatingspring10 可視化工具網站 https://easingwizard.com/ https://www.desmos.com/calculator/k01p40v0ct?langzh-CN 基本介紹 import { curves } from kit.A…

大語言模型(LLM)技術架構與工程實踐:從原理到部署

在自然語言處理領域,大語言模型(LLM)已成為顛覆性技術。從 GPT 系列到 LLaMA、ChatGLM,這些參數規模動輒百億甚至萬億的模型,不僅實現了流暢的自然語言交互,更在代碼生成、邏輯推理等復雜任務中展現出驚人能力。本文將從技術底層拆解 LLM 的核心架構,分析訓練與推理的關…

python后端之DRF框架(上篇)

一、DRF框架介紹 1、web應用開發模式 1.1、前后端不分離1.2、前后端分離2、RESTful介紹 RESTful是目前最流行的API設計風格 &#xff0c; REST 指的是一組架構約束條件和原則。滿足這些約束條件和原則的應用程序或設計就是 RESTful。 1、每一個URI代表1種資源&#xff1b; 2、客…

信創數據庫-DM(達夢)數據庫安裝教程

官方安裝文檔在這&#xff1a;安裝前準備 | 達夢技術文檔 本文也是基于這個來寫的&#xff0c;微調了一下。 1&#xff0c;下載安裝包 體驗版直接到官方下載即可&#xff1a;產品下載 | 達夢在線服務平臺 如果是有需要商業版等&#xff0c;需要聯系客服申請。 安裝包要選擇CPU…

docker常用命令集(6)

接前一篇文章&#xff1a;docker常用命令集&#xff08;5&#xff09; 本文內容參考&#xff1a; Docker login/logout 命令 | 菜鳥教程 Docker命令_docker login-CSDN博客 特此致謝&#xff01; 9. docker login 簡介 docker login命令用于登錄到docker注冊表&#xff08…

[LINUX操作系統]shell腳本之循環

1.編寫腳本for1.sh,使用for循環創建20賬戶&#xff0c;賬戶名前綴由用戶從鍵盤輸入&#xff0c;賬戶初始密碼由用戶輸入&#xff0c;例如:test1、test2、test3......[rootmaster ~]# vim for1.sh #!/bin/bashread -p "請輸入賬戶名稱前綴&#xff1a;" prefixread -p…

空間設計:不是餐廳的裝飾游戲

餐廳空間設計&#xff0c;是通過布局規劃與環境營造&#xff0c;將功能需求、品牌調性與顧客體驗融合的系統性工程 —— 它不僅決定顧客「坐得舒不舒服」&#xff0c;更影響「愿不愿意再來」「會不會主動分享」的消費決策。體驗感知的第一觸點&#xff1a;顧客進門 3 秒內&…

XSS-DOM 2

目錄 1 DOMPurify 1.1 漏洞源碼 1.2 加載框架 ?編輯 setTimeout 1.3 ok&#xff1f; 1.4 window和document 1.5 Overwrite&#xff08;document.x&#xff09; 1.5.1 打印cookie 1.6 Overwrite2&#xff08;document.x.y&#xff09; 1.6.1 form表單 1.7 toString…

從數據丟失到動畫流暢:React狀態同步與遠程數據加載全解析

在前端開發中&#xff0c;數據狀態管理與界面同步始終是核心挑戰。近期我在處理一個書簽管理應用時&#xff0c;遇到了遠程數據加載后無法顯示、界面更新異常&#xff0c;甚至動畫閃爍等一系列問題。經過多輪調試與優化&#xff0c;最終實現了數據的正確加載與流暢的界面交互。…

MySQL半同步復制機制詳解:AFTER_SYNC vs AFTER_COMMIT 的優劣與選擇

目錄深入分析與利弊對比1. AFTER_COMMIT (不推薦)2. AFTER_SYNC (強烈推薦&#xff0c;MySQL 8.0 默認)總結與強烈建議最佳實踐 MySQL 半同步復制主要有兩種實現方式&#xff0c;其核心區別在于主庫何時回復客戶端事務提交成功&#xff08;即何時認為事務完成&#xff09;&…

GEE實戰 | 4種非監督分類算法深度解析,附可直接運行的完整代碼

在遙感影像處理領域&#xff0c;非監督分類憑借其無需人工標注樣本的優勢&#xff0c;成為快速了解地物分布的得力助手。它能自動依據像素光譜特征的相似性完成聚類&#xff0c;這種“無師自通”的特性&#xff0c;讓地理空間分析變得更加高效。 今天&#xff0c;我們就來深入…

基于落霞歸雁思維框架的軟件需求管理實踐指南

作者&#xff1a;落霞歸雁 日期&#xff1a;2025-08-02 摘要 在 VUCA 時代&#xff0c;需求變更成本已占軟件總成本的 40% 以上。本文將“落霞歸雁”思維框架&#xff08;觀察現象 → 找規律 → 應用規律 → 實踐驗證&#xff09;引入需求工程全生命周期&#xff0c;通過 4 個階…

企業級AI Agent構建實踐:從理論到落地的完整指南

&#x1f680; 引言 隨著人工智能技術的快速發展&#xff0c;AI應用正在從簡單的工具轉變為智能伙伴。企業級AI Agent作為這一變革的核心載體&#xff0c;正在重新定義我們與軟件系統的交互方式。本文將深入探討如何構建一個真正意義上的企業級AI Agent系統。 &#x1f3af; …

電商項目_性能優化_限流-降級-熔斷

針對電商系統&#xff0c;在遇到大流量時&#xff0c;必須要考慮如何保障系統的穩定運行&#xff0c;常用的手段&#xff1a;限流&#xff0c;降級&#xff0c;拒絕服務。 一、限流 限流算法&#xff1a;計數器、滑動窗口、漏銅算法、令牌桶算法。 限流的方案 前端限流接入…

javaweb開發之Servlet筆記

第五章 Servlet 一 Servlet簡介 1.1 動態資源和靜態資源 靜態資源 無需在程序運行時通過代碼運行生成的資源,在程序運行之前就寫好的資源. 例如:html css js img ,音頻文件和視頻文件 動態資源 需要在程序運行時通過代碼運行生成的資源,在程序運行之前無法確定的數據,運行時…

sqli-labs靶場less26/a

less261.我們打開這一關來看一下&#xff0c;他提示我們空格和其他一些什么都被過濾了2.我們來嘗試繞過,按照之前的做法&#xff0c;可以看到閉合方式為單引號&#xff0c;并且過濾了--與#3.我們來嘗試繞過一下&#xff0c;發現可以以下的方式繞過&#xff0c;空格用&#xff0…

從Docker銜接到導入黑馬商城以及前端登錄顯示用戶或密碼錯誤的相關總結(個人理解,僅供參考)

目錄 一、前言 二、從Docker銜接到導入黑馬點評 三、談談端口映射及我的前端登錄顯示用戶或密碼錯誤 四、總結 一、前言 在學習24黑馬SpringCloud課程時&#xff0c;說實話Docker那一塊再到導入黑馬商城是真的有點折磨&#xff0c;個人感覺老師水平還是很強的&#xff0c;但…