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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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;但…