知識庫 / Spring RSS 訂閱

Spring Maven BOM 最佳實踐

Maven,Spring
HongKong
4
02:25 PM · Dec 06 ,2025

1. 概述

本快速教程將介紹如何使用 Maven,一種基於項目對象模型 (POM) 概念的工具,利用 Bill of Materials(物料清單)進行管理。

有關 Maven 的更多詳細信息,請參閲我們的 Apache Maven 教程。

2. 依賴管理概念

為了理解 BOM 是什麼以及我們可以如何使用它,我們首先需要學習一些基本概念。

2.1. Maven POM 是什麼?

Maven POM(項目對象模型)是一個 XML 文件,其中包含項目的信息和配置,Maven 使用這些信息來導入依賴項並構建項目。

2.2. Maven BOM 是什麼?

BOM 代表 Bill of Materials(物料清單)。BOM 是一種特殊的 POM,用於控制項目依賴項的版本,並提供一箇中心位置來定義和更新這些版本。

BOM 允許我們添加依賴項到模塊中,而無需擔心應該依賴哪個版本。

2.3. 傳遞依賴關係

Maven 可以通過我們的 pom.xml 自動發現我們依賴項所需要的庫,並將其包含進來。 庫的收集層級數量沒有限制。

當 2 個依賴項引用同一個特定 Artifact 的不同版本時,問題就出現了。 Maven 會選擇哪個版本?

答案是“最近定義”。這意味着所使用的版本將是項目依賴樹中距離項目最近的版本。 這種機制被稱為依賴仲裁。

以下示例可以幫助您理解依賴仲裁:

A -> B -> C -> D 1.4  and  A -> E -> D 1.0

此示例展示了項目 A 依賴於 BEBE 自身也有依賴關係,並且它們使用不同版本的 D 構件。由於通過 E 的路徑更短,因此項目 A 將使用構件 D 1.0。

確定應包含的構件版本有多種技術:

  • 我們可以始終通過在項目的 POM 中明確聲明來保證版本。例如,為了保證使用構件 D 1.4,我們應該在 pom.xml 文件中明確聲明它作為依賴項。
  • 我們可以使用 依賴管理 部分來控制構件版本,如稍後在本篇文章中解釋的。

2.4. 依賴管理

簡單來説,依賴管理是一種集中依賴信息的機制。

當我們有多個繼承共同父項目的項目時,可以將所有依賴信息放在一個共享的 POM 文件(BOM)中。

以下是一個 BOM 文件的示例:

<project ...>
	
    <modelVersion>4.0.0</modelVersion>
    <groupId>baeldung</groupId>
    <artifactId>Baeldung-BOM</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>pom</packaging>
    <name>BaelDung-BOM</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>
</project>

如我們所見,BOM 是一種標準的 POM 文件,其中包含 dependencyManagement 部分,我們可以在其中包含所有 artifact 的信息和版本。

2.5. 使用 BOM 文件

有 2 種方法可以利用之前的 BOM 文件在我們的項目中,這樣我們就可以在不擔心版本號的情況下聲明我們的依賴項。

我們可以從父項目中繼承:

<project ...>
    <modelVersion>4.0.0</modelVersion>
    <groupId>baeldung</groupId>
    <artifactId>Test</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>pom</packaging>
    <name>Test</name>
    <parent>
        <groupId>baeldung</groupId>
        <artifactId>Baeldung-BOM</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
</project>

如我們所見,我們的 Test 項目繼承了 Baeldung-BOM。

我們還可以導入 BOM。

在大型項目中,繼承的方式效率較低,因為項目只能繼承一個父項目。導入是替代方案,因為我們可以導入所需的多個 BOM。

讓我們看看如何將 BOM 文件導入到我們的項目 POM 中:

<project ...>
    <modelVersion>4.0.0</modelVersion>
    <groupId>baeldung</groupId>
    <artifactId>Test</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>pom</packaging>
    <name>Test</name>
    
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>baeldung</groupId>
                <artifactId>Baeldung-BOM</artifactId>
                <version>0.0.1-SNAPSHOT</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
</project>

2.6. 覆蓋 BOM 依賴

Artifact 的版本優先級如下:

  • 項目 pom 中直接聲明的 Artifact 版本
  • 父項目中的 Artifact 版本
  • 導入的 pom 文件中的 Artifact 版本,並考慮導入文件的導入順序
  • 依賴仲裁

我們可以通過在項目 pom 文件中明確指定 Artifact 的所需版本來覆蓋 Artifact 的版本。如果相同的 Artifact 在 2 個導入的 BOM 中定義了不同的版本,則第一個聲明的 BOM 文件中的版本將獲勝。

3. Spring BOM

我們可能會發現第三方庫或另一個 Spring 項目會引入依賴到較舊的版本。如果忘記顯式聲明直接依賴,可能會出現意外問題。

為了解決此類問題,Maven 支持 BOM(構建元依賴)的概念。

我們可以將 spring-framework-bom 導入到我們的 dependencyManagement 部分,以確保所有 Spring 依賴項都使用相同版本:

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-framework-bom</artifactId>
            <version>5.3.27</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

我們不需要在以下示例中使用 Spring 構件時指定 version 屬性:

<dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-web</artifactId>
    </dependency>
<dependencies>

4. 結論

在本文中,我們介紹了 Maven Bill-Of-Material (物料清單) 的概念,以及如何在通用 POM 中集中管理 Artifact 的信息和版本。

簡單來説,我們可以通過繼承或導入該 POM 來利用 Bill-Of-Material 的優勢。

user avatar
0 位用戶收藏了這個故事!
收藏

發佈 評論

Some HTML is okay.