1. 概要

このチュートリアルでは、Mavenアーティファクト分類子の役割を見ていきます。 続いて、それらが役立つ可能性のあるさまざまなシナリオを見ていきます。 結論を出す前に、Mavenアーティファクトタイプについても簡単に説明します。

2. Mavenアーティファクト分類子とは何ですか?

Mavenアーティファクト分類子はオプションの任意の文字列であり、生成されたアーティファクトの名前のバージョン番号の直後に追加されます。 同じPOMから構築されたアーティファクトを区別しますが、内容は異なります。

アーティファクトの定義を考えてみましょう。

<groupId>com.baeldung</groupId>
<artifactId>maven-classifier-example-provider</artifactId>
<version>0.0.1-SNAPSHOT</version>

このために、Mavenjarプラグインはmaven-classifier-example-provider-0.0.1-SNAPSHOT.jarを生成します。

2.1. 分類器を使用したアーティファクトの生成

分類子構成をjarプラグインに追加しましょう。

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <version>3.2.2</version>
            <executions>
                <execution>
                    <id>Arbitrary</id>
                    <goals>
                        <goal>jar</goal>
                    </goals>
                    <configuration>
                        <classifier>arbitrary</classifier>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

その結果、maven-classifier-example-provider-0.0.1-SNAPSHOT-arbitrary.jarmaven-classifier-example-provider-0.0.1-SNAPSHOT.jar[ X161X]が生成されます。

2.2. 分類器でアーティファクトを消費する

分類子を使用して、カスタムサフィックスを持つアーティファクトを生成できるようになりました。 分類器を使用して同じものを消費する方法を見てみましょう。

デフォルトのアーティファクトを使用するために、特別なことをする必要はありません。

<dependency>
    <groupId>com.baeldung</groupId>
    <artifactId>maven-classifier-example-provider</artifactId>
    <version>0.0.1-SNAPSHOT</version>
</dependency>

ただし、カスタムサフィックス「arbitrary」が付いたアーティファクトを使用するには、dependentency要素内でclassifier要素を使用する必要があります。

<dependency>
    <groupId>com.baeldung</groupId>
    <artifactId>maven-classifier-example-provider</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <classifier>arbitrary</classifier>
</dependency>

結局のところ、良い質問は、なぜ分類器を使用したいのかということです。 それでは、分類子が役立ついくつかの実際のユースケースを見てみましょう。

3. ソース分類子の使用

各Mavenアーティファクトには「-sources.jar」アーティファクトが付随していることがよくあります。 これには、ソースコード、つまりメインアーティファクトの.javaファイルが含まれています。 デバッグの目的で役立ちます。

3.1. ソースアーティファクトの生成

まず、maven-classifier-example-providerモジュールのソースjarを生成しましょう。 これを行うには、maven-source-pluginを使用します。

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-source-plugin</artifactId>
    <version>3.2.1</version>
    <executions>
        <execution>
            <id>attach-sources</id>
            <phase>verify</phase>
            <goals>
                <goal>jar-no-fork</goal>
            </goals>
        </execution>
    </executions>
</plugin>

それでは、実行してみましょう。

mvn clean install

その結果、maven-classifier-example-provider-0.0.1-SNAPSHOT-sources.jarアーティファクトが生成されます

3.2. ソースアーティファクトの消費

ここで、ソースアーティファクトを消費するには、いくつかの方法があります。 それらの1つを見てみましょう。 依存関係定義内の分類要素を使用して、選択的な依存関係のソースjarをフェッチできます。

<dependency>
    <groupId>com.baeldung</groupId>
    <artifactId>maven-classifier-example-producer</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <classifier>sources</classifier>
</dependency>

それでは、実行してみましょう。

mvn clean install

その結果、この特定の依存関係のソースjarがフェッチされます。 通常、POMを不必要に汚染するため、これは行いません。 したがって、通常、IDEの機能を使用してソースjarをオンデマンドで接続することを好みます。 または、 mvnCLIコマンドを使用してそれらを選択的にフェッチすることもできます。

mvn dependency:sources -DincludeArtifactIds=maven-classifier-example-provider

つまり、ここで重要なポイントは、ソース分類子を使用してソースjarを参照することです。

4. Javadoc分類子の使用

ソースjarのユースケースと同じように、Javadocを使用しています。 メインのjarアーティファクトのドキュメントが含まれています。

4.1. Javadocアーティファクトの生成

maven-javadoc-plugin を使用して、Javadocアーティファクトを生成してみましょう。

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-javadoc-plugin</artifactId>
    <version>3.3.2</version>
    <executions>
        <execution>
            <id>attach-javadocs</id>
            <goals>
                <goal>jar</goal>
            </goals>
        </execution>
    </executions>
</plugin>

プラグインを定義したら、次を実行してみましょう。

mvn clean install

その結果、maven-classifier-example-provider-0.0.1-SNAPSHOT-javadoc.jarアーティファクトが生成されます。

4.2. Javadocアーティファクトの消費

次に、生成されたJavadocをmvnを介してコンシューマーの観点からダウンロードしましょう。

mvn dependency:resolve -Dclassifier=javadoc -DincludeArtifactIds=maven-classifier-example-provider

-Dclassifier = javadoc オプションは、分類子をjavadocとして指定します。

5. テスト分類子の使用

次に、分類器が提供できる別のユースケースを見てみましょう。 モジュールのテストjarを取得したい理由はさまざまです。 1つは、再利用したい特定のテストスタブがある可能性があります。 分類子を介して、メインのjarアーティファクトとは無関係にテストをjarに取得する方法を見てみましょう。

5.1. テストジャーの生成

まず、maven-classifier-example-providerモジュールのテストjarを生成しましょう。 これを行うには、test-jarゴールを指定してMavenjarプラグインを使用します。

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <version>3.2.2</version>
    <executions>
        <execution>
            <id>Test Jar</id>
            <goals>
                <goal>test-jar</goal>
            </goals>
        </execution>
    </executions>
</plugin>

それでは、実行してみましょう。

mvn clean install

その結果、テストjar maven-classifier-example-provider-0.0.1-SNAPSHOT-tests.jar が生成され、インストールされます。

5.2. テストジャーの消費

それでは、テストjarの依存関係をコンシューマーモジュールmaven-classifier-example-consumerに取得しましょう。 これは、tests分類子を使用して行います。

<dependency>
    <groupId>com.baeldung</groupId>
    <artifactId>maven-classifier-example-provider</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <classifier>tests</classifier>
</dependency>

これで、のテストパッケージで利用可能なクラスにアクセスできるようになります。 maven-classifier-example-provider 。 

6. 分類子を使用して複数のJavaバージョンをサポートする

以前は、任意の分類子を使用して、maven-classifier-example-providerモジュール用の2番目のjarを作成していました。 それをもっと実用的にしましょう。

Javaは現在、6か月というはるかに速いペースで新しいバージョンをリリースしています。 したがって、モジュール開発者は複数のバージョンのJavaをサポートできる必要があります。 異なるJavaバージョンでコンパイルされたモジュール用に複数のjarを構築するのは難しい作業のように聞こえるかもしれません。 そこで、Maven分類子が助けになります。 単一のPOMを使用して、異なるJavaバージョンでコンパイルされた複数のjarを構築できます。

6.1. 複数のJavaバージョンでのコンパイル

まず、JDK8とJDK11の両方を使用してコンパイル済みクラスファイルを生成するようにMavenコンパイラプラグインを構成します。

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.10.0</version>
    <executions>
        <execution>
            <id>JDK 8</id>
            <phase>compile</phase>
            <goals>
                <goal>compile</goal>
            </goals>
            <configuration>
                <source>8</source>
                <target>8</target>
                <fork>true</fork>
            </configuration>
        </execution>
        <execution>
            <id>JDK 11</id>
            <phase>compile</phase>
            <goals>
                <goal>compile</goal>
            </goals>
            <configuration>
                <outputDirectory>${project.build.outputDirectory}_jdk11</outputDirectory>
                <executable>${jdk.11.executable.path}</executable>
                <source>8</source>
                <target>11</target>
                <fork>true</fork>
            </configuration>
        </execution>
    </executions>
</plugin>

Java8用とJava11用の2つの実行ブロックを設定しています。

これに続いて、outputDirectoryをJava11とは異なるように構成しました。 一方、Java 8のコンパイルでは、デフォルトのoutputDirectoryが使用されます。

次に、ソースとターゲットのJavaバージョン構成があります。 ソースコードはJava8を使用して記述されているため、ソースバージョンを8のままにし、Java11実行ブロックのターゲットバージョンを11として変更します。

Java11のコンパイラjavacの実行可能パスも明示的に指定しました。Java8の場合、Mavenはデフォルトの javacで構成されます。この場合、Java8のjava c であるシステム:

mvn clean compile

その結果、ターゲットフォルダー内にclassesとclasses_jdk11の2つのフォルダーが生成されます。

6.2. 複数のJavaバージョン用のJarアーティファクトの生成

次に、Maven jarプラグインを使用して、モジュールを2つの別々のjarにパッケージ化することができます。

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <version>3.2.2</version>
    <executions>
        <execution>
            <id>default-package-jdk11</id>
            <phase>package</phase>
            <goals>
                <goal>jar</goal>
            </goals>
            <configuration>
                <classesDirectory>${project.build.outputDirectory}_jdk11</classesDirectory>
                <classifier>jdk11</classifier>
            </configuration>
        </execution>
    </executions>
</plugin>

分類子がjdk11に設定されていることがわかります。

それでは、実行してみましょう。

mvn clean install

その結果、2つのjarファイルが生成されます– maven-classifier-example-provider-0.0.1-SNAPSHOT-jdk11.jar maven-classifier-example-provider-0.0.1-SNAPSHOT.jar。 1つ目はJava11コンパイラを使用してコンパイルされ、2つ目はJava8コンパイラを使用してコンパイルされました。

6.3. 特定のJavaバージョンのJarアーティファクトの消費

そして最後に、モジュールのコンシューマーは、使用しているJavaバージョンに基づいて、関連するjarアーティファクトを選択できます。 消費者の視点からこれらの瓶をどのように使用できるか見てみましょう。

Java 8プロジェクトに取り組んでいる場合、特別なことをする必要はありません。 バニラ依存関係を追加するだけです。

<dependency>
    <groupId>com.baeldung</groupId>
    <artifactId>maven-classifier-example-provider</artifactId>
    <version>0.0.1-SNAPSHOT</version>
</dependency>

ただし、Java 11プロジェクトで作業している場合は、分類子を介してJava11でコンパイルされたjarを明示的に要求する必要があります。

<dependency>
    <groupId>com.baeldung</groupId>
    <artifactId>maven-classifier-example-provider</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <classifier>jdk11</classifier>
</dependency>

7. アーティファクト分類子と アーティファクトタイプ

この記事を締めくくる前に、アーティファクトのタイプについて簡単に見てみましょう。 アーティファクトのタイプと分類子は密接に関連していますが、互換性はありません。 アーティファクトタイプは、アーティファクトのパッキング形式を定義します。 POMまたはjar。 また、ほとんどの場合、ファイル拡張子に変換されます。 対応する分類子もある場合があります。

言い換えると、アーティファクトタイプはアーティファクトのパッキングを処理し、分類子を使用して生成されたアーティファクトの名前を変更できます。

Java SourcesとJavadocで以前に見た2つのユースケースは、分類子としてsourcesjavadocを使用するアーティファクトタイプの例です。

8. 結論

この記事では、分類子が単一のPOMファイルから複数のアーティファクトを生成する方法をどのように提供するかを見ました。 分類子を使用すると、コンシューマーは必要に応じて特定のモジュールのさまざまなアーティファクトから選択できます。

いつものように、コードサンプルはGitHubから入手できます。