Maven - 全面解析 Maven BOM (Bill of Materials):打造高效依赖管理与模块化开发
文章目录
- What's BOM
- Why Bom
- 常見的官方BOM
- Spring Maven BOM dependency
- SpringBoot SpringCloud Maven BOM dependency
- JBOSS Maven BOM dependency
- RESTEasy Maven BOM dependency
- Jersey Maven BOM dependency
- How Bom
- 定义BOM
- 其他工程使用的方法
- BOM VS POM
What’s BOM
BOM(Bill of Materials) 是由Maven提供的功能,它通过定义一整套相互兼容的jar包版本集合,使用时只需要依赖该BOM文件,即可放心的使用需要的依赖jar包,且无需再指定版本号。
Bom 通常是项目中单独的一个模块,即只有单个pom.xml文件的module,并配合 dependencyManagement 等标签实现项目的全局依赖统一管理
BOM的维护方负责版本升级,并保证BOM中定义的jar包版本之间的兼容性。
Why Bom
-
方便使用者在声明依赖的客户端时不需要指定版本号外,
-
最主要的原因是可以解决依赖冲突
舉個例子
-
项目A依赖项目B 2.1和项目C 1.2版本:
-
项目B 2.1依赖项目D 1.1版本;
-
项目C 1.2依赖项目D 1.3版本;
在该例中,项目A对于项目D的依赖就会出现冲突,按照maven dependency mediation的规则,最后生效的可能是:项目A中会依赖到项目D1.1版本(就近原则,取决于路径和依赖的先后,和Maven版本有关系)。
在这种情况下,由于项目C依赖1.3版本的项目D,但是在运行时生效的确是1.1版本,所以在运行时很容易产生问题,如 NoSuchMethodError, ClassNotFoundException等,有些jar包冲突定位还是比较难的,这种方式可以节省很多定位此类问题的时间。
常見的官方BOM
Each project has it’s own maven bom file
请注意,没有通用或通用的bom文件。每个项目(如果支持此功能)都提供自己的bom文件,并管理其相关依赖项的版本。
Spring、SpringBoot、SpringCloud自身都采用了此机制来解决第三方包的冲突 .
建議项目中也建议使用此优良传统, 尤其实在项目开发初期,在后期再修改成BOM可能涉及很多版本的修改,就比较难了。
Spring Maven BOM dependency
<dependencyManagement><dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-framework-bom</artifactId><version>4.0.1.RELEASE</version><type>pom</type><scope>import</scope></dependency></dependencies>
</dependencyManagement>
SpringBoot SpringCloud Maven BOM dependency
<dependencyManagement><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>2.4.4</version><type>pom</type><scope>import</scope></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>2020.0.2</version><type>pom</type><scope>import</scope></dependency></dependencies>
</dependencyManagement>
JBOSS Maven BOM dependency
<dependencyManagement><dependencies><dependency><groupId>org.jboss.bom</groupId><artifactId>jboss-javaee-6.0-with-tools</artifactId><version>${some.version}</version><type>pom</type><scope>import</scope></dependency></dependencies>
</dependencyManagement>
RESTEasy Maven BOM dependency
<dependencyManagement><dependencies><dependency><groupId>org.jboss.resteasy</groupId><artifactId>resteasy-bom</artifactId><version>3.0.6.Final</version><type>pom</type><scope>import</scope></dependency></dependencies>
</dependencyManagement>
Jersey Maven BOM dependency
<dependencyManagement><dependencies><dependency><groupId>org.glassfish.jersey</groupId><artifactId>jersey-bom</artifactId><version>${jersey.version}</version><type>pom</type><scope>import</scope></dependency></dependencies>
</dependencyManagement>
How Bom
定义BOM
BOM本质上是一个普通的POM文件,区别是对于使用方而言,生效的只有 <dependencyManagement>这一个部分。
只需要在<dependencyManagement>定义对外发布的客户端版本即可,比如需要在项目中统一所有SpringBoot和SpringCloud的版本
我們以 YuDao為例看一下
整體結構
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>cn.iocoder.boot</groupId><artifactId>yudao-dependencies</artifactId><version>${revision}</version><packaging>pom</packaging><name>${project.artifactId}</name><description>基础 bom 文件,管理整个项目的依赖版本</description><url>https://github.com/YunaiV/ruoyi-vue-pro</url><properties><revision>1.8.0-snapshot</revision><!-- 统一依赖管理 --><spring.boot.version>2.7.13</spring.boot.version><!-- Web 相关 --><springdoc.version>1.6.15</springdoc.version>......</properties><dependencyManagement><dependencies>....</dependencies></dependencyManagement></project>
重點來了 ,如下 dependencyManagement
<dependencyManagement><dependencies><!-- 统一依赖管理 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>${spring.boot.version}</version><type>pom</type><scope>import</scope></dependency><!-- 业务组件 -->.....</dependencies></dependencyManagement>

其他工程使用的方法
在项目主pom.xml文件中<dependencyManagement></dependencyManagement>节点下加入BOM的GAV信息如
我們還是以YuDao為例看一下
<dependencyManagement><dependencies><dependency><groupId>cn.iocoder.boot</groupId><artifactId>yudao-dependencies</artifactId><version>${revision}</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement>

在需要使用相关JAR包的pom.xml文件中<dependencies></dependencies>节点下引入如下:
我们还是以YuDao的另外一个子模块为例

这种设置后,如果项目要求升级Spring版本,只需要在提供方升级验证兼容性,然后修改BOM依赖即可
如果需要使用不同于当前bom中所维护的jar包版本,则加上<version>覆盖即可, 比如
<dependencies><!--此时用到Spring和Gson都不需要加版本号,会自动引用BOM中提供的版本--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency><dependency><groupId>com.google.code.gson</groupId><artifactId>gson</artifactId><!--会覆盖掉BOM中声明的版本2.8.6,使用自定义版本2.8.2--><version>2.8.2</version></dependency>
</dependencies>
BOM VS POM
首先,BOM 只是普通的 pom.xml 文件 - 它们不包含源代码,其唯一目的是声明其包含的模块。它定义了将在库中创建的所有构件的版本。希望使用该库的其他项目应在其 pom 的依赖管理部分导入此 pom。
POM 文件不仅仅是依赖关系。例如组织和许可证,项目的 URL,项目的依赖,插件,配置文件等许多信息。它还控制项目的整个构建过程。

相关文章:
Maven - 全面解析 Maven BOM (Bill of Materials):打造高效依赖管理与模块化开发
文章目录 Whats BOMWhy Bom常見的官方BOMSpring Maven BOM dependencySpringBoot SpringCloud Maven BOM dependencyJBOSS Maven BOM dependencyRESTEasy Maven BOM dependencyJersey Maven BOM dependency How Bom定义BOM其他工程使用的方法 BOM VS POM What’s BOM BOM&…...
Lua脚本对比redis事务区别是什么
redis官方对于lua脚本的解释:Redis使用同一个Lua解释器来执行所有命令,同时,Redis保证以一种原子性的方式来执行脚本:当lua脚本在执行的时候,不会有其他脚本和命令同时执行,这种语义类似于 MULTI/EXEC。从别…...
ES安装问题汇总
max file descriptors [4096] for elasticsearch process is too low, increase to at least [65535] 问题描述 ES启动报错。其原因是ES需要的的最小max file descriptors为65535,我们设置的是4096,需要增大max file descriptors的值。 解决方案 调大…...
煜邦转债,华设转债,兴瑞转债,神通转债上市价格预测
煜邦转债 基本信息 转债名称:煜邦转债,评级:A,发行规模:4.10806亿元。 正股名称:煜邦电力,今日收盘价:8.82元,转股价格:10.12元。 当前转股价值 转债面值 / …...
R语言生存分析算法的简单组合
library(survival) library(randomForestSRC)# 生成模拟数据 set.seed(123) n <- 200 time <- rexp(n, rate 0.1) status <- rbinom(n, size 1, prob 0.7) var1 <- rnorm(n) var2 <- rnorm(n) var3 <- rnorm(n) data1 <- data.frame(time time, statu…...
Qt应用开发(基础篇)——滚屏区域基类 QAbstractScrollArea
一、前言 QAbstractScrollArea滚屏区域抽象类继承于QFrame,QFrame继承于QWidget,是QListview(列表浏览器)、QTableview(表格浏览器)、QTextEdit(文本编辑器)、QTextBrowser(文本浏览器)等所有需要滚屏区域部件的抽象基类。 框架类QFrame介绍 QAbstractSc…...
HTTPS安全通信
HTTPS,TLS/SSL Hyper Text Transfer Protocol over Secure Socket Layer,安全的超文本传输协议,网景公式设计了SSL(Secure Sockets Layer)协议用于对Http协议传输的数据进行加密,保证会话过程中的安全性。 使用TCP端口默认为443 TLS:(Transport Layer Security,传输层…...
C语言暑假刷题冲刺篇——day1
目录 一、选择题 二、编程题 🎈个人主页:库库的里昂 🎐CSDN新晋作者 🎉欢迎 👍点赞✍评论⭐收藏✨收录专栏:C语言每日一练 ✨其他专栏:代码小游戏C语言初阶🤝希望作者的文章能对你…...
trollcave靶场
配置 第一步:启动靶机时按下 shift 键, 进入以下界面 第二步:选择第二个选项,然后按下 e 键,进入编辑界面 将这里的ro修改为rw single init/bin/bash,然后按ctrlx,进入一个相当于控制台的界面…...
反馈式编译
一、 反馈式编译 简介 PGO,即Profile-Guided Optimizations,反馈式优化。PGO是编译器的又一优化技术,PGO与其它的一些优化技术/选项有一个明显的区别是:PGO优化是分三步完成的,是一个动态的优化过程。 反馈优化过…...
sql-libs靶场-----0x00、环境准备
文章目录 一、PhPstudy下载、安装二、Sqli-libs下载、搭建三、启用Sqli-libs phpstudy地址:https://www.xp.cn/ sqli-libs地址:https://github.com/Audi-1/sqli-labs 一、PhPstudy下载、安装 1、下载–解压–安装,安装完成如下图 2、更换php…...
一百四十九、Kettle——Linux上安装的kettle8.2创建共享资源库时遇到的问题(持续更新中)
一、目的 在kettle8.2在Linux上安装好可以启动界面、并且可以连接MySQL、Hive、ClickHouse等数据库后开始创建共享资源库,但是遇到了一些问题 二、Linux系统以及kettle版本 (一)Linux:CentOS 7 英文的图形化界面模式 &#…...
Mysql 建索引规范
索引规范 今天在建线上表的时候,做了一个varchar的索引,运维说varchar的索引会占用很大的内存。 于是 上网搜了一下建索引规范 一、建表规约 【强制】(1) 存储引擎必须使用InnoDB 解读:InnoDB支持事物、行级锁、并发…...
新基建助推数字经济,CosmosAI率先布局AI超算租赁新纪元
伦敦, 8月14日 - 在英国伦敦隆重的Raffles OWO举办的欧盟数字超算新时代战略合作签约仪式,CosmosAI、Infinite Money Fund与Internet Research Lab三方强强联手,达成了历史性的合作协议,共同迈向超算租赁新纪元。 这次跨界的合作昭示了全球…...
微服务06-分布式事务解决方案Seata
1、Seata 概述 Seata事务管理中有三个重要的角色: TC (Transaction Coordinator) - **事务协调者:**维护全局和分支事务的状态,协调全局事务提交或回滚。 TM (Transaction Manager) - **事务管理器:**定义全局事务的范围、开始全局事务、提交或回滚全局事务。 RM (Resourc…...
Wireshark有线网卡抓包报错The capture session could not be initiated on capture device
最近在使用Wireshark进行抓包排错时,选择网卡后提示报错,在此之前从未出现过,报错内容如下: 提示内容是The capture session could not be initiated on capture device,无法在捕获设备上启动捕获会话要求操作是Please…...
FreeSWITCH执行bridge时如何“制造“ringback
dialplan如果这样写: <action application"record_session" data"$${recordings_dir}/${caller_id_number}.${strftime(%Y-%m-%d-%H-%M-%S)}.wav"/> <action application"bridge" data"user/1001"/> 或者这样…...
Java # 类加载子系统
一、概述 1、 类加载器子系统负责从文件系统或者网络中加载.Class文件 2、classloader只负责类的加载,至于他是否能够运行由执行引擎来决定 3、加载的类的信息会存放在方法区(元空间)中 二、加载过程 1、加载阶段 1、通…...
YOLOv5改进系列(21)——替换主干网络之RepViT(清华 ICCV 2023|最新开源移动端ViT)
【YOLOv5改进系列】前期回顾: YOLOv5改进系列(0)——重要性能指标与训练结果评价及分析 YOLOv5改进系列(1)——添加SE注意力机制 YOLOv5改进系列(2...
安卓中常见的字节码指令介绍
问题背景 安卓开发过程中,经常要通过看一些java代码对应的字节码,来了解java代码编译后的运行机制,本文将通过一个简单的demo介绍一些基本的字节码指令。 问题分析 比如以下代码: public class test {public static void main…...
为什么你的DeepSeek工具调用总是超时?揭秘底层Tool Executor线程池配置的2个致命默认值及修复代码
更多请点击: https://kaifayun.com 第一章:为什么你的DeepSeek工具调用总是超时?揭秘底层Tool Executor线程池配置的2个致命默认值及修复代码 DeepSeek-R1 模型在调用外部工具(如 HTTP API、数据库查询、Python 函数)…...
别再交智商税了!实测告诉你:用AI写论文,哪款软件控制重复率和AI率效果最好?
眼下毕业生和科研工作者的焦虑点很集中:论文查重率好不容易过关,AIGC疑似率却频频爆红;花了大把时间手动改写降AI痕迹,重复率又反弹回来。想靠普通工具同时守住查重和AI两道防线,根本就是天方夜谭。 事实上通用模型AI…...
解锁硬件潜能:3步让你的电脑性能飙升50%
解锁硬件潜能:3步让你的电脑性能飙升50% 【免费下载链接】Universal-x86-Tuning-Utility Unlock the full potential of your Intel/AMD based device. 项目地址: https://gitcode.com/gh_mirrors/un/Universal-x86-Tuning-Utility 你是否曾经有过这样的经历…...
从岭回归到Lasso:正则化原理、稀疏性与ADMM算法实践
1. 项目概述:从岭回归到Lasso的深度解析在机器学习和统计建模的实践中,我们常常面临一个核心矛盾:模型在训练数据上表现优异,但在未见过的数据上却一塌糊涂,这就是所谓的“过拟合”。想象一下,你为了记住一…...
高性能Python多智能体建模框架:Mesa 3.0架构解析与工程实践指南
高性能Python多智能体建模框架:Mesa 3.0架构解析与工程实践指南 【免费下载链接】mesa Mesa is an open-source Python library for agent-based modeling, ideal for simulating complex systems and exploring emergent behaviors. 项目地址: https://gitcode.c…...
长期使用Taotoken服务对于API调用稳定性的主观感受记录
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 长期使用Taotoken服务对于API调用稳定性的主观感受记录 在持续数月的项目开发与日常使用中,我通过Taotoken平台接入并调…...
3种方法快速上手Label Studio:终极数据标注工具完全指南
3种方法快速上手Label Studio:终极数据标注工具完全指南 【免费下载链接】label-studio Label Studio is a multi-type data labeling and annotation tool with standardized output format 项目地址: https://gitcode.com/GitHub_Trending/la/label-studio …...
昇腾CANN ops-transformer RoPE 旋转位置编码:从复数旋转到 NTK 外推的完整实战
Transformer 的自注意力机制本身对位置不敏感——"猫坐在垫子上"和"垫子坐在猫上"的 attention score 一样,因为点积 QK^T 不区分 token 顺序。位置编码就是给每个 token 打上它在序列中的位置标签。 RoPE(Rotary Position Embeddin…...
在Node.js服务端项目中集成Taotoken聚合大模型能力
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 在Node.js服务端项目中集成Taotoken聚合大模型能力 对于Node.js后端开发者而言,在构建需要AI能力的Web服务时ÿ…...
独立开发者如何借助Taotoken低成本试验多种AI模型
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 独立开发者如何借助Taotoken低成本试验多种AI模型 对于资源有限的独立开发者而言,构建AI应用原型时面临两个核心挑战&a…...
