ZetCode

Maven BOM

最后修改日期:2025 年 6 月 12 日

在本教程中,我们将探讨如何使用 Maven BOM(物料清单) 来高效地管理多个项目中的依赖项版本。通过利用 BOM,开发人员可以确保一致性、避免版本冲突,并简化复杂应用程序中的依赖项管理。

一个 Maven BOM(物料清单) 是一个专门的 POM(项目对象模型) 文件,它充当依赖项版本的中央参考。BOM 允许您一次性定义依赖项版本,并在需要时重用它们,而不是在不同模块或项目中手动指定每个依赖项的版本。

这种方法对于具有大量共享公共依赖项的模块的大型应用程序尤其有利。没有 BOM,版本不匹配可能导致兼容性问题,使得升级和维护变得困难。

BOM 通过提供一个依赖项版本真相的单一来源来简化依赖项管理。它允许开发人员将预定义的依赖项集及其版本导入到他们的项目中,从而确保所有模块和项目都使用共享依赖项的相同版本。这降低了版本冲突的风险,并使得跨多个项目管理更新更加容易。

BOM 有几个优点,包括:

创建 BOM 项目

要创建 BOM 项目,您需要定义一个 POM 文件,并将打包类型设置为 pom。此 POM 将包含 dependencyManagement 部分,您可以在其中指定要管理的依赖项的版本。

bom/pom.xml
<project>
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.example</groupId>
    <artifactId>example-bom</artifactId>
    <version>1.0.0</version>
    <packaging>pom</packaging>
    
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>3.2.0</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            
            <dependency>
                <groupId>com.fasterxml.jackson</groupId>
                <artifactId>jackson-bom</artifactId>
                <version>2.16.1</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            
            <dependency>
                <groupId>com.example</groupId>
                <artifactId>common-lib</artifactId>
                <version>2.5.0</version>
            </dependency>
        </dependencies>
    </dependencyManagement>
</project>

在此示例中,我们定义了一个具有以下元素的 BOM 项目:

<dependencyManagement> 部分包含一个带有其版本的依赖项列表。这些依赖项可以导入到使用此 BOM 的其他项目中。import 范围用于打算用作 BOM 的依赖项,允许其他项目继承此 BOM 中定义的版本,而无需显式指定它们。

您可以在 BOM 中添加任何您想管理的依赖项。在此示例中,我们包含了 Spring Boot BOM、Jackson BOM 和一个名为 common-lib 的自定义库。这些依赖项的版本在 BOM 中定义,允许其他项目在不显式指定版本的情况下使用它们。

在其他项目中使用 BOM

要在其他 Maven 项目中使用 BOM,您需要在项目 POM 文件的 dependencyManagement 部分导入它。这允许您继承 BOM 中定义的版本,而无需在每个项目的 POM 中显式指定它们。以下是如何执行此操作的示例:

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

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
        <!-- Version inherited from BOM -->
    </dependency>
    
    <dependency>
        <groupId>com.example</groupId>
        <artifactId>common-lib</artifactId>
        <!-- Version inherited from BOM -->
    </dependency>
</dependencies>

dependencyManagement 部分允许您导入 BOM,BOM 定义了其中所有依赖项的版本。当您在项目中声明依赖项时,您无需指定它们的版本,因为它们是从 BOM 继承的。

这种方法简化了版本管理,因为您可以在一个地方更新 BOM,所有使用它的项目都会自动使用更新的版本。它还有助于避免版本冲突,并确保所有项目都使用共享依赖项的相同版本。

继承父 BOM

您还可以创建继承自另一个 BOM 的 BOM,允许您根据需要扩展或覆盖版本。这对于创建基于现有 BOM(如 Spring Boot BOM)的自定义 BOM 非常有用。

project/pom.xml
<project>
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>com.example</groupId>
        <artifactId>example-bom</artifactId>
        <version>1.0.0</version>
    </parent>
    
    <artifactId>my-project</artifactId>
    
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>
</project>

在此示例中,项目继承自 example-bom,其中包含 Spring Boot BOM。这允许您使用 BOM 中定义 的版本,而无需在您的项目 POM 中显式声明它们。

带 BOM 的多模块项目

在多模块 Maven 项目中,您可以创建一个父 POM,其中包含 BOM 并管理所有子模块的依赖项。这使您能够在项目的所有模块中维护一致的依赖项版本。

parent/pom.xml
<project>
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.example</groupId>
    <artifactId>parent-project</artifactId>
    <version>1.0.0</version>
    <packaging>pom</packaging>
    
    <modules>
        <module>bom</module>
        <module>service</module>
        <module>web</module>
    </modules>
    
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>com.example</groupId>
                <artifactId>example-bom</artifactId>
                <version>${project.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
</project>

在此父 POM 中,我们定义了一个导入 BOM 的 dependencyManagement 部分。每个子模块随后可以声明其依赖项而无需指定版本,因为它们将继承 BOM 中定义的版本。

覆盖 BOM 版本

您可以在需要时覆盖 BOM 中的特定版本。当您想使用与 BOM 中定义的版本不同的依赖项版本,同时仍然受益于 BOM 对其他依赖项的版本管理时,这很有用。

project/pom.xml
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>com.example</groupId>
            <artifactId>example-bom</artifactId>
            <version>1.0.0</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
        
        <!-- Override specific version -->
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.15.2</version>
        </dependency>
    </dependencies>
</dependencyManagement>

在此示例中,我们导入了 example-bom,但将 jackson-databind 的版本覆盖为 2.15.2。这允许我们使用此依赖项的不同版本,同时仍然受益于 BOM 中定义的其他版本。

流行的公共 BOM

许多流行的库和框架都提供自己的 BOM 以简化依赖项管理。这些 BOM 定义了一组推荐版本,用于通常一起使用的依赖项,从而更容易管理项目中的版本。

使用 Spring Boot BOM
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-dependencies</artifactId>
            <version>3.2.0</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

Spring Boot BOM 为 Spring Boot 应用程序提供了一组托管的依赖项,确保所有依赖项彼此兼容。

使用 Jackson BOM
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>com.fasterxml.jackson</groupId>
            <artifactId>jackson-bom</artifactId>
            <version>2.16.1</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

Jackson BOM 为 Jackson JSON 处理库提供了一组托管的依赖项,确保所有 Jackson 组件都彼此兼容。

BOM 最佳实践

来源

Maven 依赖机制

在本文中,我们探讨了如何使用 Maven BOM 来管理多个项目中的依赖项版本。

作者

我叫 Jan Bodnar,我是一名充满激情的程序员,拥有丰富的编程经验。我从 2007 年开始撰写编程文章。迄今为止,我已撰写了 1400 多篇文章和 8 本电子书。我在编程教学方面有十多年的经验。

列出所有Java教程