1. 概要

このチュートリアルでは、Mavenを使用してマルチモジュールプロジェクトを構築する方法を学習します。

最初に、マルチモジュールプロジェクトとは何かについて説明し、このアプローチに従うことの利点を見ていきます。 次に、サンプルプロジェクトを設定します。 Mavenの優れた紹介については、このチュートリアルを確認してください。

2. Mavenのマルチモジュールプロジェクト

マルチモジュールプロジェクトは、サブモジュールのグループを管理するアグリゲーターPOMから構築されます。 ほとんどの場合、アグリゲーターはプロジェクトのルートディレクトリにあり、pomタイプのパッケージが必要です。

サブモジュールは通常のMavenプロジェクトであり、個別に、またはアグリゲーターPOMを介してビルドできます。

アグリゲーターPOMを介してプロジェクトをビルドすることにより、 pom とは異なるパッケージタイプを持つ各プロジェクトは、ビルドされたアーカイブファイルになります。

3. マルチモジュールを使用する利点

このアプローチを使用することの重要な利点は、重複を減らすことができることです。

フロントエンドモジュールとバックエンドモジュールのいくつかのモジュールで構成されるアプリケーションがあるとしましょう。 今、私たちがそれらに取り組み、それらの両方に影響を与える機能を変更すると想像してください。 その場合、専用のビルドツールがなければ、両方のコンポーネントを別々にビルドするか、コードをコンパイルしてテストを実行し、結果を表示するスクリプトを作成する必要があります。 その後、プロジェクトにさらに多くのモジュールを追加すると、管理と保守が難しくなります。

現実の世界では、プロジェクトは、ビルドライフサイクル中にさまざまな操作を実行し、依存関係とプロファイルを共有し、他の BOMプロジェクトを含めるために、特定のMavenプラグインを必要とする場合があります。

したがって、マルチモジュールを活用する場合、アプリケーションのモジュールを1つのコマンドで構築でき、順序が重要な場合は、Mavenがそれを判断します。 他のモジュールと大量の構成を共有することもできます。

4. 親POM

Mavenは次のような方法で継承をサポートします各pom.xmlファイルには、暗黙の親POMがあります。 それはスーパーPOMと呼ばれています Mavenバイナリに配置できます。 これらの2つのファイルはMavenによってマージされ、EffectivePOMを形成します。

独自のpom.xmlファイルを作成できます。これは、親プロジェクトとして機能します。 次に、依存関係のあるすべての構成をその中に含め、子モジュールの親として設定して、子モジュールから継承できるようにします。

継承に加えて、Mavenは集約の概念を提供します。 この機能を利用する親POMは、集約POM と呼ばれます。基本的に、この種のPOM は、pom.xmlファイルでモジュールを明示的に宣言します。

5. サブモジュール

サブモジュールまたはサブプロジェクトは、親POMから継承する通常のMavenプロジェクトです。 すでに知っているように、継承により、構成と依存関係をサブモジュールと共有できます。 ただし、プロジェクトを一度にビルドまたはリリースする場合は、親POMでサブモジュールを明示的に宣言する必要があります。 最終的には、親POMが親になり、集約POMにもなります。

6. アプリケーションの構築

Mavenのサブモジュールと階層を理解したので、それらを示すためのサンプルアプリケーションを作成しましょう。 Mavenのコマンドラインインターフェイスを使用してプロジェクトを生成します。

このアプリは、以下を表す3つのモジュールで構成されます。

  • ドメインのコア部分
  • いくつかのRESTAPIを提供するWebサービス
  • ある種のユーザー向けWebアセットを含むwebapp

Mavenに焦点を当てるため、これらのサービスの実装は未定義のままになります。

6.1. 親POMの生成

まず、親プロジェクトを作成しましょう

mvn archetype:generate -DgroupId=com.baeldung -DartifactId=parent-project

親が生成されたら、親のディレクトリにある pom.xml ファイルを開き、パッケージをpomとして追加する必要があります。

<packaging>pom</packaging>

パッケージをpomタイプに設定することで、プロジェクトが親またはアグリゲーターとして機能することを宣言します。 それ以上のアーティファクトは生成されません。

これで、アグリゲーターが完成したら、サブモジュールを生成できます。

ただし、これは共有されるすべての構成が配置される場所であり、最終的には子モジュールで再利用されることに注意する必要があります。 特に、ここではdependentencyManagementまたはpluginManagementを利用できます。

6.2. サブモジュールの作成

親POMの名前はparent-projectであるため、親のディレクトリにいることを確認し、generateコマンドを実行する必要があります。

cd parent-project
mvn archetype:generate -DgroupId=com.baeldung -DartifactId=core
mvn archetype:generate -DgroupId=com.baeldung -DartifactId=service
mvn archetype:generate -DgroupId=com.baeldung -DartifactId=webapp

使用されているコマンドに注意してください。 親に使用したものと同じです。 ここで重要なのは、これらのモジュールは通常のMavenプロジェクトですが、Mavenはそれらがネストされていることを認識しています。 ディレクトリをparent-projectに変更すると、親のパッケージが pom、であり、pom.xmlファイルが変更されることがわかりました。によると。

parent-project のpom.xmlで、modulesセクション内にすべてのサブモジュールが追加されます。

<modules>
    <module>core</module>
    <module>service</module>
    <module>webapp</module>
</modules>

個々のサブモジュールのpom.xmlでは、parentセクションに親プロジェクトが追加されます。

<parent>
  <artifactId>parent-project</artifactId>
  <groupId>com.baeldung</groupId>
  <version>1.0-SNAPSHOT</version>
</parent>

次に、Mavenは3つのサブモジュールを正常に生成します。

サブモジュールが持つことができる親は1つだけであることに注意することが重要です。 ただし、多くのBOMをインポートできます。 BOMファイルの詳細については、この記事を参照してください。

6.3. プロジェクトの構築

これで、3つのモジュールすべてを一度にビルドできます。親のプロジェクトディレクトリで、次のコマンドを実行します。

mvn package

これにより、すべてのモジュールがビルドされます。 コマンドの次の出力が表示されます。

[INFO] Scanning for projects...
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Build Order:
[INFO] parent-project                                                     [pom]
[INFO] core                                                               [jar]
[INFO] service                                                            [jar]
[INFO] webapp                                                             [war]
...
[INFO] Reactor Summary for parent-project 1.0-SNAPSHOT:
[INFO] parent-project ..................................... SUCCESS [  0.272 s]
[INFO] core ............................................... SUCCESS [  2.043 s]
[INFO] service ............................................ SUCCESS [  0.627 s]
[INFO] webapp ............................................. SUCCESS [  0.572 s]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------

Reactorにはparent-projectがリストされていますが、 pom タイプであるため除外され、ビルドの結果、他のすべての.jarファイルが3つになります。モジュール。 この場合、ビルドはそのうちの3つで発生します。

さらに、Maven Reactorはプロジェクトを分析し、適切な順序でビルドします。 したがって、 webapp モジュールがサービスモジュールに依存している場合、Mavenは最初に service をビルドし、次にwebappをビルドします。

6.3. 親プロジェクトで依存関係管理を有効にする

依存関係管理は、マルチモジュールの親プロジェクトとその子の依存関係情報を一元化するためのメカニズムです。

共通の親を継承するプロジェクトまたはモジュールのセットがある場合、依存関係に関する必要なすべての情報を共通のpom.xmlファイルに入れることができます。 これにより、子POMのアーティファクトへの参照が簡略化されます。

サンプルの親のpom.xmlを見てみましょう。

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>5.3.16</version>
        </dependency>
        //...
    </dependencies>
</dependencyManagement>

親でspring-core バージョンを宣言することにより、 spring -core に依存するすべてのサブモジュールは、groupId ArtifactId 、およびバージョンは継承されます:

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

さらに、親の pom.xml で依存関係管理の除外を提供して、特定のライブラリが子モジュールに継承されないようにすることができます。

<exclusions>
    <exclusion>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
    </exclusion>
</exclusions>

最後に、子モジュールが別のバージョンの管理された依存関係を使用する必要がある場合は、子のpom.xmlファイルの管理されたバージョンをオーバーライドできます。

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-core</artifactId>
    <version>4.3.30.RELEASE</version>
</dependency>

子モジュールは親プロジェクトから継承しますが、親プロジェクトには必ずしも集約するモジュールがないことに注意してください。 一方、親プロジェクトは、それを継承しないプロジェクトを集約する場合もあります。

継承と集約の詳細については、このドキュメントを参照してください。

6.4. サブモジュールの更新とプロジェクトの構築

各サブモジュールのpackagingタイプを変更できます。 たとえば、 pom.xml ファイルを更新して、webappモジュールのpackagingWARに変更しましょう。

<packaging>war</packaging>

プラグインリストにmaven-war-pluginを追加します。

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-war-plugin</artifactId>
            <version>3.3.2</version>
            <configuration>
               <failOnMissingWebXml>false</failOnMissingWebXml>
            </configuration>
        </plugin>
    </plugins>
</build>

これで、 mvn cleaninstallコマンドを使用してプロジェクトのビルドをテストできます。 Mavenログの出力は次のようになります。

[INFO] Scanning for projects...
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Build Order:
[INFO] 
[INFO] parent-project                                                     [pom]
[INFO] core                                                               [jar]
[INFO] service                                                            [jar]
[INFO] webapp                                                             [war]
//............. 
[INFO] Reactor Summary for parent-project 1.0-SNAPSHOT:
[INFO] 
[INFO] parent-project ..................................... SUCCESS [  0.272 s]
[INFO] core ............................................... SUCCESS [  2.043 s]
[INFO] service ............................................ SUCCESS [  0.627 s]
[INFO] webapp ............................................. SUCCESS [  1.047 s]

7. 結論

この記事では、Mavenマルチモジュールを使用する利点について説明しました。 また、通常のMavenの親POMと集約POMを区別しました。 最後に、簡単なマルチモジュールをセットアップして試してみる方法を探りました。

Mavenは優れたツールですが、それ自体は複雑です。 Mavenの詳細については、SonatypeMavenリファレンスまたはApacheMavenガイドを参照してください。 Mavenのマルチモジュール設定の高度な使用法を探す場合は、Spring Bootプロジェクトがその使用法をどのように活用しているかを確認できます。

この記事で使用されているすべてのコード例は、Githubから入手できます。