1.概要

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

Mavenの詳細については、記事リンク/maven[Apache Maven Tutorial]を参照してください。

2.依存関係管理の概念

BOMとは何か、そしてBOMが何に使えるのかを理解するには、まず基本概念を学ぶ必要があります。

2.1. Maven POMとは何ですか?

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

2.2. Maven BOMとは何ですか?

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

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

2.3. 推移的な依存関係

Mavenは、

pom.xml

で私たち自身の依存関係に必要なライブラリを発見し、それらを自動的に含めることができます。ライブラリが収集される依存関係レベルの数に制限はありません。

ここでの衝突は、2つの依存関係が特定の成果物の異なるバージョンを参照している場合に発生します。どちらがMavenに含まれますか?

  • ここでの答えは「最も近い定義」です。これは、使用されているバージョンが依存関係のツリーの中で私たちのプロジェクトに最も近いものになることを意味します。これは依存調停と呼ばれます。

次の例を見て、依存関係の調停を明確にしましょう。

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

この例は、プロジェクト

A



B



Eに依存していることを示しています。

E

を通るパスが短いため、成果物

D

1.0が

A__プロジェクトのビルドに使用されます。

どのバージョンの成果物を含める必要があるかを判別するためのさまざまな手法があります。

  • 私達は私達の中で明示的にそれを宣言することによっていつでもバージョンを保証することができます

プロジェクトのPOMたとえば、

D

1.4が確実に使用されるようにするには、__pom.xmlファイルに依存関係として明示的に追加する必要があります。

  • アーティファクトを制御するために

    Dependency Management

    セクションを使うことができます。

この記事の後半で説明するバージョン。

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は、依存関係管理セクションを持つ通常の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のバージョン

ファイルのインポート方法
。依存調停

  • 明示的に

目的のバージョンのプロジェクトのpomに含まれるアーティファクト
** インポートされた2の同じバージョンが異なるバージョンで定義されている場合

BOM、次に最初に宣言されたBOMファイル内のバージョンが勝ちます

3.春のBOM

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

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


dependencyManagement

セクションに

spring-framework-bom

をインポートして、すべての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の利点を利用するためにそれを継承またはインポートすることができます。

この記事のコード例はhttps://github.com/eugenp/tutorials/tree/master/spring-bom[over on GitHub]にあります。