システム開発現場の道具箱

株式会社モノクレアが運営するIT技術系のブログです。システム開発の現場で役に立つ情報を掲載しています。

独習Maven 《応用編》 マルチモジュール

今回の独習Mavenは、マルチモジュール編です。

Mavenはプロジェクトに親子関係を持たせることができます。 そして、親プロジェクトに複数の子プロジェクトが紐付く構成をマルチモジュールと呼びます。

今回は以下の実行を通して、プロジェクトの親子関係について理解を深めたいと思います。

  • 親pomの作成
  • 子プロジェクトの作成
  • コンパイル・テスト実行

親pomの作成

まず始めに、親pomの作成を行いましょう。 parentディレクトリを作成し、配下にpom.xmlを作成します。

parent
    pom.xml

pom.xmlを開き、以下の内容を貼り付けます。 親pomには、dependencyにcommons-langを設定しています。

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>a.b.c</groupId>
  <artifactId>parent</artifactId>
  <packaging>pom</packaging>
  <version>1.0-SNAPSHOT</version>
  <name>parent</name>
  <dependencies>
    <dependency>
      <groupId>org.apache.commons</groupId>
      <artifactId>commons-lang3</artifactId>
      <version>3.4</version>
    </dependency>
  </dependencies>
</project>

子プロジェクトの作成

parentディレクトリにchildプロジェクトを作成しましょう。 コンソールを開き、以下のコマンドを実行します。

cd parent
mvn archetype:generate -DarchetypeArtifactId=maven-archetype-quickstart

プロジェクト作成中に、プロジェクトのパラメーターについて入力を促されます。 ここではパラメーターの値を以下のとおり指定します。

パラメータ名
groupId a.b.c
artifactId child
version 1.0-SNAPSHOT (default)
package a.b.c (default)

また、パラメーターは以下のように対話式で指定します。 [Enter]キーをタイプすることで、次の項目に進みます。

Define value for property 'groupId': : a.b.c[Enter]
Define value for property 'artifactId': : child[Enter]
Define value for property 'version':  1.0-SNAPSHOT: :[Enter]
Define value for property 'package':  a.b.c: :[Enter]
Confirm properties configuration:
groupId: a.b.c
artifactId: child
version: 1.0-SNAPSHOT
package: a.b.c
 Y: :[Enter]

コマンド実行後、以下のディレクトリ構成でchildプロジェクトが作成されます。

parent
|   pom.xml
|
\---child
    |   pom.xml
    |
    \---src
        |
        \---main
        |   \---java
        |       \---a
        |           \---b
        |               \---c
        |                   \---App.java
        \---test
            \---java
                \---a
                    \---b
                        \---c
                            \---AppTest.java

プロジェクトが作成されたら、先ほど作成した親pomを開き、内容を確認しましょう。pom.xmlのファイルパスは以下の通りです。

parent/pom.xml

pom.xmlには、以下のとおり子モジュール定義が追加されています。

  :
  <modules>
    <module>child</module>
  </modules>
</project>

今度は、作成したchildプロジェクトのpom.xmlを開き、内容を確認しましょう。pom.xmlのファイルパスは以下の通りです。

parent/child/pom.xml

childプロジェクトのpom.xmlには、以下のとおりparentが定義されています。

<?xml version="1.0"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <groupId>a.b.c</groupId>
    <artifactId>parent</artifactId>
    <version>1.0-SNAPSHOT</version>
  </parent>
  <groupId>a.b.c</groupId>
  <artifactId>child</artifactId>
  <version>1.0-SNAPSHOT</version>
  <name>child</name>
  <url>http://maven.apache.org</url>
  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
  </dependencies>
</project>

次に、childプロジェクトのAppTest.javaを編集しましょう。 AppTest.javaのファイルパスは以下の通りです。

parent/child/src/test/java/a/b/c/AppTest.java

AppTest.javaを開き、testAppメソッドにcommons-langのメソッド呼び出しを追加します。

package a.b.c;

  :

public class AppTest 
    extends TestCase
{
    :

    public void testApp()
    {
        System.out.println(org.apache.commons.lang3.StringUtils.join("Hello", " ", "World!"));
        assertTrue( true );
    }
}

コンパイル・テスト実行

コンソールを開き、以下のコマンドを実行します。

cd parent
mvn test

「BUILD SUCCESS」が表示された後、以下のとおり「Hello World!」のメッセージが表示されれば成功です。

-------------------------------------------------------
 T E S T S
-------------------------------------------------------
Running a.b.c.AppTest
Hello World!

マルチモジュールでは、親pomの設定を子pomに継承することができます。
今回のケースでは、親pomのdependency設定が子pomに継承され、commons-langをchildプロジェクトで使用することができました。このように、複数のプロジェクトで共通の設定を親pomに集約することで、子pomでの設定を簡略化することが可能です。

マルチモジュール編は以上です。