1. 概要

このクイックチュートリアルでは、プロジェクトオブジェクトモデル(POM)の概念に基づくツールであるMavenがBOMまたは「部品表」をどのように利用できるかを見ていきます。

Mavenの詳細については、記事ApacheMavenチュートリアルを確認してください。

2. 依存関係管理の概念

BOMとは何か、そしてBOMを何に使用できるかを理解するには、最初に基本的な概念を学ぶ必要があります。

2.1. Maven POMとは何ですか?

Maven POMは、依存関係をインポートしてプロジェクトをビルドするためにMavenが使用する情報と構成(プロジェクトに関する)を含むXMLファイルです。

2.2. Maven BOMとは何ですか?

BOMは部品表の略です。 BOMは、プロジェクトの依存関係のバージョンを制御し、それらのバージョンを定義および更新するための中心的な場所を提供するために使用される特別な種類のPOMです。

BOMは、依存すべきバージョンを気にすることなく、モジュールに依存関係を追加する柔軟性を提供します。

2.3. 推移的な依存関係

Mavenは、 pom.xml で独自の依存関係に必要なライブラリを検出し、それらを自動的に含めます。 ライブラリが収集される依存関係レベルの数に制限はありません。

ここでの競合は、2つの依存関係が特定のアーティファクトの異なるバージョンを参照している場合に発生します。 Mavenに含まれるのはどれですか?

ここでの答えは「最も近い定義」です。 これは、使用されるバージョンが依存関係のツリーでプロジェクトに最も近いバージョンになることを意味します。 これは依存関係メディエーションと呼ばれます。

依存関係のメディエーションを明確にするために、次の例を見てみましょう。

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

この例は、プロジェクトABEに依存していることを示しています。BEには独自の依存関係があります。 Dアーティファクトのさまざまなバージョンに遭遇します。 アーティファクトD 1.0は、 E を通るパスが短いため、Aプロジェクトのビルドで使用されます。

アーティファクトのどのバージョンを含めるかを決定するためのさまざまな手法があります。

  • プロジェクトのPOMで明示的に宣言することにより、常にバージョンを保証できます。 たとえば、 D 1.4が使用されることを保証するには、pom.xmlファイルに依存関係として明示的に追加する必要があります。
  • この記事の後半で説明するように、依存関係管理セクションを使用してアーティファクトのバージョンを制御できます。

2.4. 依存関係の管理

簡単に言えば、依存関係管理は、依存関係情報を一元化するメカニズムです。

共通の親を継承する一連のプロジェクトがある場合、すべての依存関係情報をBOMと呼ばれる共有POMファイルに入れることができます。

次に、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はdependentencyManagement セクションを持つ通常のPOMファイルであり、すべてのアーティファクトの情報とバージョンを含めることができます。

2.5. BOMファイルの使用

プロジェクトで以前のBOMファイルを使用する方法は2つあり、バージョン番号を気にすることなく依存関係を宣言する準備が整います。

親から継承できます:

<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の依存関係を上書きする

アーティファクトのバージョンの優先順位は次のとおりです。

  1. プロジェクトpomでのアーティファクトの直接宣言のバージョン
  2. 親プロジェクトのアーティファクトのバージョン
  3. ファイルのインポート順序を考慮した、インポートされたpomのバージョン
  4. 依存関係の調停
  • プロジェクトのpomでアーティファクトを目的のバージョンで明示的に定義することにより、アーティファクトのバージョンを上書きできます。
  • 同じアーティファクトが2つのインポートされたBOMの異なるバージョンで定義されている場合、最初に宣言されたBOMファイルのバージョンが優先されます

3. 春のBOM

サードパーティのライブラリまたは別のSpringプロジェクトが、古いリリースへの推移的な依存関係を引き込む場合があります。 直接の依存関係を明示的に宣言するのを忘れると、予期しない問題が発生する可能性があります。

このような問題を克服するために、MavenはBOM依存関係の概念をサポートしています。

spring-framework-bomdependencyManagementセクションにインポートして、すべてのSpring依存関係が同じバージョンであることを確認できます。

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-framework-bom</artifactId>
            <version>4.3.8.RELEASE</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の部品表の概念と、アーティファクトの情報とバージョンを一般的なPOMに一元化する方法を示しました。

簡単に言えば、BOMのメリットを活用するために、継承またはインポートすることができます。

この記事のコード例は、GitHubにあります。