Mavenによるマルチモジュールプロジェクト

Mavenを使用したマルチモジュールプロジェクト

1. 概要

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

まず、マルチモジュールプロジェクトとは何かについて説明し、このアプローチに従うことのメリットを見ていきます。 次に、サンプルプロジェクトを設定します。 Mavenの概要については、this tutorialを確認してください。

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

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

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

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

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

このアプローチを使用することの重要な利点は、we may reduce duplication.

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

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

したがって、マルチモジュールを活用する場合、build our application’s modules in a single commandを使用できます。順序が重要な場合は、Mavenがこれを判断します。 また、share a vast amount of configuration with other modulesも可能です。

4. 親POM

Mavenは、each pom.xml file has the implicit parent POM, it’s called Super POMの方法で継承をサポートし、Mavenバイナリーに配置できます。 これら2つのファイルはMavenによってマージされ、効果的なPOMを形成します。

したがって、own pom.xml file which will serve us as the parent projectを作成できます。 次に、依存関係のあるすべての構成を含め、これを子モジュールの親として設定して、子モジュールから継承できるようにします。

継承に加えて、Mavenは集約の概念を提供します。 この機能を活用する親POMは、集約POM.と呼ばれます。基本的に、この種のPOMdeclares its modules explicitly in its pom.xml file.

5. サブモジュール

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

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

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

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

  • ドメインのcore 部分

  • いくつかのRESTAPIを提供するウェブservice 

  • ある種のユーザー向けWebアセットを含むwebapp 

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

6.1. 親POMの生成

First, let’s create a parent project

mvn archetype:generate -DgroupId=org.example -DartifactId=parent-project

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

pom

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

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

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

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

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

cd parent-project
mvn archetype:generate -DgroupId=org.example  -DartifactId=core
mvn archetype:generate -DgroupId=org.example  -DartifactId=service
mvn archetype:generate -DgroupId=org.example  -DartifactId=webapp

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

その後、Mavenは3つのサブモジュールを生成し、いくつかのタグを追加して親のpom.xmlファイルを変更します。


    core
    service
    webapp

これで、親は集約されたモジュールを明示的に宣言します。

次に、親プロジェクトディレクトリでmvn packageコマンドを実行すると、Mavenは3つのモジュールすべてをビルドしてテストします。

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

結局のところ、すべての構成をサブモジュールと共有する場合は、サブモジュールのpom.xmlファイルで、親を宣言する必要があります。


    org.example
    parent-project
    1.0-SNAPSHOT

サブモジュールは親を1つしか持つことができないことに注意する必要があります。 ただし、多くのBOMをインポートできます。 BOMファイルの詳細については、this articleをご覧ください。

6.3. プロジェクトの構築

Now we can build all three modules at once.親のプロジェクトディレクトリで、次を実行します。

mvn package

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

[INFO] Scanning for projects...
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Build Order:
[INFO] parent-project
[INFO] core
[INFO] service
[INFO] webapp
...
[INFO] Reactor Summary:
[INFO] parent-project ..................................... SUCCESS [  0.140 s]
[INFO] core ............................................... SUCCESS [  2.195 s]
[INFO] service ............................................ SUCCESS [  0.767 s]
[INFO] webapp ............................................. SUCCESS [  0.572 s]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------

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

7. 結論

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

Mavenは素晴らしいツールですが、それ自体は複雑です。 Mavenの詳細については、Sonatype Maven referenceまたはApache Maven guidesをご覧ください。 セットアップされたMavenマルチモジュールの高度な使用法を探している場合は、how Spring Boot project leverages the usage of itを参照してください。

例のすべてのコード例はMavenを使用して構築されているため、GitHub project websiteを簡単にチェックして、さまざまなMaven構成を確認できます。