春とMaven BOM

Maven BOMを使用したSpring

1. 概要

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

Mavenの詳細については、記事Apache Maven Tutorialを確認してください。

2. 依存関係管理の概念

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

2.1. Maven POMとは何ですか?

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

2.2. Maven BOMとは何ですか?

BOMは、部品表の略です。 A BOM is a special kind of POM that is used to control the versions of a project’s dependencies and provide a central place to define and update those versions.

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ファイルの依存関係として明示的に追加する必要があります。

  • この記事の後半で説明するように、Dependency Managementセクションを使用してアーティファクトのバージョンを制御できます。

2.4. 依存関係管理

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

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

以下は、BOMファイルの作成方法の例です。



    4.0.0
    example
    example-BOM
    0.0.1-SNAPSHOT
    pom
    example-BOM
    parent pom
    
        
            
                test
                a
                1.2
            
            
                test
                b
                1.0
                compile
            
            
                test
                c
                1.0
                compile
            
        
    

ご覧のとおり、BOMはdependencyManagementセクションを持つ通常のPOMファイルであり、すべてのアーティファクトの情報とバージョンを含めることができます。

2.5. BOMファイルの使用

プロジェクトで以前のBOMファイルを使用する方法は2つあり、バージョン番号を気にせずに依存関係を宣言できます。

親から継承できます:


    4.0.0
    example
    Test
    0.0.1-SNAPSHOT
    pom
    Test
    
        example
        example-BOM
        0.0.1-SNAPSHOT
    

ご覧のとおり、プロジェクトTestは例BOMを継承しています。

BOMをインポートすることもできます。

大規模なプロジェクトでは、プロジェクトは1つの親しか継承できないため、継承のアプローチは効率的ではありません。 インポートは、必要な数のBOMをインポートできる代替手段です。

BOMファイルをプロジェクトPOMにインポートする方法を見てみましょう。


    4.0.0
    example
    Test
    0.0.1-SNAPSHOT
    pom
    Test

    
        
            
                example
                example-BOM
                0.0.1-SNAPSHOT
                pom
                import
            
        
    

2.6. BOM依存関係の上書き

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

  1. プロジェクトpomでのアーティファクトの直接宣言のバージョン

  2. 親プロジェクトのアーティファクトのバージョン

  3. ファイルをインポートする順序を考慮した、インポートされたPOMのバージョン

  4. 依存関係の調停

    • プロジェクトのpomでアーティファクトを目的のバージョンで明示的に定義することにより、アーティファクトのバージョンを上書きできます。

    • インポートされた2つのBOMの異なるバージョンで同じアーティファクトが定義されている場合、最初に宣言されたBOMファイルのバージョンが優先されます

3. 春の部品表

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

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

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


    
        
            org.springframework
            spring-framework-bom
            4.3.8.RELEASE
            pom
            import
        
    

次の例のようにSpringアーティファクトを使用する場合、version属性を指定する必要はありません。


    
        org.springframework
        spring-context
    
    
        org.springframework
        spring-web
    

4. 結論

この簡単な記事では、Mavenの部品表の概念と、アーティファクトの情報とバージョンを一般的なPOMに一元化する方法を示しました。

簡単に言えば、それを継承またはインポートして、BOMの利点を活用できます。

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