项目中使用之Maven BOM

项目中使用之Maven BOM

1.什么是BOM

在 Maven 中,BOM 是"Bill Of Materials"(物料清单)的缩写。它是 Maven 项目管理中使用的一种特殊类型的 POM(Project Object Model)文件,通常用来提供一组有共同版本管理的依赖列表。

BOM全称是Bill Of Materials,译作材料清单。BOM本身并不是一种特殊的文件格式,而是一个普通的POM文件,只是在这个POM中,我们罗列的是一个工程的所有依赖和其对应的版本。该文件一般被其它工程使用,当其它工程引用BOM中罗列的jar包时,不用显示指定具体的版本,会自动使用BOM对应的jar版本。

所以BOM的好处是用来管理一个工程的所有依赖版本信息。

2.BOM的简单格式

xml 复制代码
<modelVersion>4.0.0</modelVersion>
    <groupId>org.javatop</groupId>
    <artifactId>BOMtest</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>pom</packaging>
    <name>BOMtest</name>
    <description>parent pom</description>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>test</groupId>
                <artifactId>a</artifactId>
                <version>1.2</version>
            </dependency>
            <dependency>
                <groupId>test</groupId>
                <artifactId>b</artifactId>
                <version>1.0</version>
                <scope>compile</scope>
            </dependency>
            <dependency>
                <groupId>test</groupId>
                <artifactId>c</artifactId>
                <version>1.0</version>
                <scope>compile</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

其中定义的关键信息是

  • <packaging>pom</packaging>打包方式是pom文件
  • <dependencyManagement><dependencies>下定义的各种依赖的版本

3.BOM的好处

  • 减少了版本冲突的风险,特别是当你使用许多相互依赖的库时。
  • 简化了项目依赖的升级过程,只需在 BOM 文件中更新依赖版本,所有引用该 BOM 的项目都会使用新版本。
  • 在企业环境中,BOM 可以提供一个企业级标准的依赖版本集合。

4.BOM的目的

  1. 集中依赖版本管理:在多模块项目中,或者在需要共享相同依赖集的不同项目之间,BOM 允许统一管理依赖的版本,这样你可以确保所有项目或子模块使用的都是相同版本的依赖库。
  2. 简化依赖定义:项目可以通过引用 BOM 来避免在每个项目的 POM 文件中重复定义依赖版本,减少重复并使依赖管理变得更加清晰。

5.如何使用BOM

当你想在你的项目中使用 BOM 时,你可以在项目的 POM 文件里像下面这样声明它:

xml 复制代码
<project xmlns="http://maven.apache.org/POM/4.0.0">
    <modelVersion>4.0.0</modelVersion>

    <!-- ... other settings ... -->

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>com.mycompany</groupId>
                <artifactId>my-bom</artifactId>
                <version>1.0.0</version>
                <scope>import</scope>
                <type>pom</type>
            </dependency>
        </dependencies>
    </dependencyManagement>
</project>

5.1 通过dependencyManagement

parent只能指定一个BOM。如果我还想引入一个或多个BOM,这个时候,就可以使用<dependencyManagement>配置。也即<dependencyManagement> 不光可以用来定义BOM本身的依赖清单,也可以用作BOM的引入。因为dependencyManagement本身是做依赖管理的,Jar是一种依赖,BOM当然也是一种依赖

5.2 使用

那么如何在其他模块中使用呢,非常简单,因为我们父依赖中引入了并管理了依赖版本。

我们子模块可以直接引用依赖即可,就不需要再引入版本了。

5.3 怎么查看依赖的BOM的具体清单

由于BOM不是一个jar包,所以你没办法在idea的依赖libary中看看到该文件

6.版本冲突的一些规则

当出现版本冲突时,具体使用哪一个版本的优先顺序是

  • 直接在当前工程中显示指定的版本
  • parent中配置的父工程使用的版本
  • 在当前工程中通过dependencyManagement引入的BOM清单中的版本,当引入的多个BOM都有对应jar包时,先引入的BOM生效
  • 上述三个地方都没配置,则启用依赖调解dependency mediation

7.总结

以上便是本文的全部内容,本人才疏学浅,文章有什么错误的地方,欢迎大佬们批评指正!我是Leo,一个在互联网行业的小白,立志成为更好的自己。

如果你想了解更多关于Leo,可以关注公众号-程序员Leo,后面文章会首先同步至公众号。

本文由博客一文多发平台 OpenWrite 发布!

相关推荐
爱敲键盘的猴子3 分钟前
Java并发编程 -- synchronized
java·java并发编程
snow@li5 分钟前
Spring 项目 Java 访问修饰符 + 非访问修饰符全景梳理详解
java·后端·spring
大模型念念12 分钟前
Spring 框架入门:从零开始构建你的第一个应用
java·后端·spring
雨落在了我的手上20 分钟前
Java数据结构(九):栈和队列
java·开发语言·数据结构
春生野草1 小时前
个人笔记--大顶堆和基数排序
java·数据结构·算法
高铭杰1 小时前
Golang sync.Mutex实现原理学习
java·学习·golang
头发还在的女程序员11 小时前
医院陪诊管理系统怎么选择?——2026 年选型避坑与架构参考
java·开发语言·陪诊系统·陪诊app·医院陪诊陪护
CodeStats11 小时前
【Spring事务】Spring事务注解 @Transactional 完整体系:从 MySQL 隔离级别到 MyBatis 原理详解
java·spring·mybatis·事务·transactional
我命由我1234511 小时前
Android 开发问题:为 PDFView 设置一个带有黑色边框的背景 drawable,但边框没有生效
android·java·java-ee·android studio·android jetpack·android-studio·android runtime
都叫我大帅哥14 小时前
从Python到Java:为什么企业级Agent最终会选择Java?
java·ai编程