一、什么是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;包括同样可移植的新颖…