1. 序章

Mavenは、プロジェクトのビルドに役立つさまざまなプラグインを提供しています。 ただし、これらのプラグインでは不十分な場合があり、独自のプラグインを開発する必要があります。

幸い、 Maven は、このプロセスに役立ついくつかの便利なツールを提供します。

このチュートリアルでは、非常に実用的であり、Mavenプラグインを最初から作成する方法を段階的に示します。

また、プロジェクトでの使用方法とドキュメントの作成方法についても説明します。

2. プラグインの作成

このチュートリアルでは、プロジェクトに含まれる依存関係の数をカウントするcounter-maven-pluginというプラグインを開発します。 プラグインの名前を選択するときは、Mavenが推奨するプラグインの命名規則に従うことが非常に重要です。

開発する内容がわかったので、次に行う必要があるのは、Mavenプロジェクトを作成することです。 pom.xml で、プラグインの groupId ArtifactId 、およびversionを定義します。

<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>com.baeldung</groupId>
    <artifactId>counter-maven-plugin</artifactId>
    <packaging>maven-plugin</packaging>
    <version>0.0.1-SNAPSHOT</version>
 
    <name>counter-maven-plugin Maven Mojo</name>
    <url>http://maven.apache.org</url>
 
    <properties>
        <maven.compiler.target>1.8</maven.compiler.target>
        <maven.compiler.source>1.8</maven.compiler.source>
    </properties>
</project>

パッケージをmaven-pluginに設定していることに注意してください。

この場合、プロジェクトを手動で作成しましたが、maven-archetype-mojoを使用して作成することもできます。

mvn archetype:generate 
  -DgroupId=com.baeldung 
  -DartifactId=counter-maven-plugin 
  -Dversion=0.0.1-SNAPSHOT 
  -DarchetypeGroupId=org.apache.maven.archetypes 
  -DarchetypeArtifactId=maven-archetype-mojo

これを行うときは、依存関係のデフォルトバージョンを更新して、最新のものを使用する必要があります。

3. モジョを作成する

次に、最初のモジョを作成します。 Mojoは、プラグインが実行する目標を表すJavaクラスですプラグインに1つ以上のmojoが含まれています。

私たちのmojoは、プロジェクトの依存関係の数を数える責任があります。

3.1. 依存関係の追加

mojoを作成する前に、pom.xmlにいくつかの依存関係を追加する必要があります。

<dependencies>
    <dependency>
        <groupId>org.apache.maven</groupId>
        <artifactId>maven-plugin-api</artifactId>
        <version>3.6.3</version>
    </dependency>
    <dependency>
        <groupId>org.apache.maven.plugin-tools</groupId>
        <artifactId>maven-plugin-annotations</artifactId>
        <version>3.6.0</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>org.apache.maven</groupId>
        <artifactId>maven-project</artifactId>
        <version>2.2.1</version>
    </dependency>
</dependencies>

maven-plugin-api依存関係が必要であり、mojoを作成するために必要なクラスとインターフェースが含まれています。 maven-plugin-annotations 依存関係は、クラスでアノテーションを使用するのに便利です。 maven-project 依存関係により、プラグインを含むプロジェクトに関する情報にアクセスできます。

3.2. Mojoクラスの作成

これで、モジョを作成する準備が整いました。

mojoはMojoインターフェースを実装する必要があります。 この例では、 AbstractMojo から拡張するため、executeメソッドを実装するだけで済みます。

@Mojo(name = "dependency-counter", defaultPhase = LifecyclePhase.COMPILE)
public class DependencyCounterMojo extends AbstractMojo {
    // ...
}

ご覧のとおり、dependency-counterが目標の名前です。 一方、デフォルトでは compile フェーズにアタッチされているため、この目標を使用するときに必ずしもフェーズを指定する必要はありません。

プロジェクト情報にアクセスするには、MavenProjectをパラメーターとして追加する必要があります。

@Parameter(defaultValue = "${project}", required = true, readonly = true)
MavenProject project;

このオブジェクトは、コンテキストが作成されるときにMavenによって注入されます。

この時点で、executeメソッドを実装し、プロジェクトの依存関係の数を数えることができます。

public void execute() throws MojoExecutionException, MojoFailureException {
    List<Dependency> dependencies = project.getDependencies();
    long numDependencies = dependencies.stream().count();          
    getLog().info("Number of dependencies: " + numDependencies);
}

getLog()メソッドは、Mavenログへのアクセスを提供します。 AbstractMojoはすでにそのライフサイクルを処理しています。

3.3. パラメータの追加

以前に追加したパラメーターは読み取り専用であり、ユーザーが構成することはできません。 また、Mavenによって注入されるため、一種の特別なものと言えます。

このセクションでは、ユーザーがカウントする依存関係の範囲を指定できるパラメーターを追加します。

したがって、mojoでscopeパラメーターを作成しましょう。

@Parameter(property = "scope")
String scope;

プロパティ属性のみを設定しました。 これにより、コマンドラインまたはpomプロパティを介してこのプロパティを設定できます。 残りの属性については、デフォルト値で問題ありません。

次に、 execute メソッドを変更して、このパラメーターを使用し、カウント時に依存関係をフィルター処理します。

public void execute() throws MojoExecutionException, MojoFailureException {
    List<Dependency> dependencies = project.getDependencies();
    long numDependencies = dependencies.stream()
      .filter(d -> (scope == null || scope.isEmpty()) || scope.equals(d.getScope()))
      .count();          
    getLog().info("Number of dependencies: " + numDependencies);
}

より高度なタイプのパラメーターについては、公式ドキュメントで説明されています。

4. プラグインのテスト

プラグインの開発は完了です。 それが機能するかどうかを確認するためにテストしてみましょう!

まず、ローカルリポジトリにプラグインをインストールする必要があります。

mvn clean install

次のセクションでは、最初にコマンドラインからプラグインを実行する方法を説明します。 次に、Mavenプロジェクトでの使用方法についても説明します。

4.1. プラグインの実行

プラグインの完全修飾名を指定することで、コマンドラインでプラグインの目標を実行できます。

mvn groupId:artifactId:version:goal

私たちの場合、次のようになります。

mvn com.baeldung:counter-maven-plugin:0.0.1-SNAPSHOT:dependency-counter

ただし、このチュートリアルの冒頭で述べたプラグインの命名規則に従っている場合、Mavenはプラグインのプレフィックスを解決し、コマンドを短縮できます。

mvn counter:dependency-counter

このコマンドは最新バージョンのプラグインを使用していることに注意してください。 また、groupIdsettings.xmlpluginGroupsに追加する必要があるため、Mavenもこのグループを検索することに注意してください。

<pluginGroups>
    <pluginGroup>com.baeldung</pluginGroup>
</pluginGroups>

コマンドの出力を確認すると、プラグインがプラグインのpom.xmlの依存関係の数をカウントしていることがわかります。

[INFO] Scanning for projects...
[INFO] 
[INFO] -----------------< com.baeldung:counter-maven-plugin >------------------
[INFO] Building counter-maven-plugin Maven Mojo 0.0.1-SNAPSHOT
[INFO] ----------------------------[ maven-plugin ]----------------------------
[INFO] 
[INFO] --- counter-maven-plugin:0.0.1-SNAPSHOT:dependency-counter (default-cli) @ counter-maven-plugin ---
[INFO] Number of dependencies: 3
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 0.529 s
[INFO] Finished at: 2019-11-30T20:43:41+01:00
[INFO] ------------------------------------------------------------------------

コマンドラインプロパティを使用して、scopeパラメーターを設定することもできます。

mvn counter:dependency-counter -Dscope=test

scope の名前は、mojoのパラメーターのproperty属性で定義した名前であることに注意してください。

4.2. プロジェクトでのプラグインの使用

プロジェクトでプラグインを使用して、プラグインをテストしてみましょう。

プラグインがカウントするいくつかの依存関係を持つ非常に単純なMavenプロジェクトを作成します。

<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/xsd/maven-4.0.0.xsd">

    <modelVersion>4.0.0</modelVersion>
    <groupId>com.baeldung</groupId>
    <artifactId>example</artifactId>
    <packaging>pom</packaging>
    <version>0.0.1-SNAPSHOT</version>

    <dependencies>
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
            <version>3.12.0</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
    </dependencies>
</project>

最後に、プラグインをビルドに追加します。 dependency-counterゴールを実行することを明示的に設定する必要があります。

<build>
    <plugins>
        <plugin>
            <groupId>com.baeldung</groupId>
            <artifactId>counter-maven-plugin</artifactId>
            <version>0.0.1-SNAPSHOT</version>
            <executions>
                <execution>
                    <goals>
                        <goal>dependency-counter</goal>
                    </goals>
                </execution>
            </executions>
            <configuration>
                <scope>test</scope>
            </configuration>
        </plugin>
    </plugins>
</build>

構成ノードでスコープパラメーターを指定したことに注意してください。また、mojoはデフォルトで compile フェーズに接続されているため、フェーズを指定していません。

ここで、プラグインを実行するためにcompileフェーズを実行する必要があります。

mvn clean compile

そして、プラグインはtestの依存関係の数を出力します。

[INFO] Scanning for projects...
[INFO] 
[INFO] ------------------------< com.baeldung:example >------------------------
[INFO] Building example 0.0.1-SNAPSHOT
[INFO] --------------------------------[ pom ]---------------------------------
[INFO] 
[INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ example ---
[INFO] 
[INFO] --- counter-maven-plugin:0.0.1-SNAPSHOT:dependency-counter (default) @ example ---
[INFO] Number of dependencies: 1
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 0.627 s
[INFO] Finished at: 2019-11-25T18:57:22+01:00
[INFO] ------------------------------------------------------------------------

このチュートリアルでは、プラグインのユニットテストまたは統合テストを作成する方法については説明していませんが、Mavenにはそれを行うためのメカニズムがいくつか用意されています。

5. ドキュメントの追加

Mavenプラグインを作成するときは、他の人が簡単に使用できるようにドキュメントを生成することが重要です

maven-plugin-pluginを使用してこのドキュメントを生成する方法について簡単に説明します。

maven-plugin-plugin はすでにプロジェクトに含まれていますが、最新バージョンを使用するように更新します。

また、maven-site-pluginについても同じことを行います。

<build>
    <pluginManagement>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-plugin-plugin</artifactId>
                <version>3.6.0</version>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-site-plugin</artifactId>
                <version>3.8.2</version>
            </plugin>
        </plugins>
    </pluginManagement>
</build>

次に、javadocMojoに追加し、プラグインのpom.xmlにメタデータを追加したことを確認する必要があります。

<organization>
    <name>Baeldung</name>
    <url>https://www.baeldung.com/</url>
</organization>

その後、pom.xmlにレポートセクションを追加する必要があります。

<reporting>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-plugin-plugin</artifactId>
            <reportSets>
                <reportSet>
                    <reports>
                        <report>report</report>
                    </reports>
                </reportSet>
            </reportSets>
        </plugin>
    </plugins>
</reporting>

最後に、mavensiteコマンドを使用してドキュメントを生成します。

mvn site

ターゲットフォルダ内に、生成されたすべてのHTMLファイルを含むsiteディレクトリがあります。 plugin-info.html は、プラグインのドキュメントを含むものです。

ドキュメントに追加するその他のオプションは、Mavenプラグインドキュメントガイドにあります。

6. 結論

このチュートリアルでは、Mavenプラグインを作成する方法を示しました。 最初に単純なプラグインを実装しました。これは、典型的なMavenプラグインプロジェクトの構造を理解するのに役立ちました。 次に、プラグインの開発に役立つMavenが提供するツールのいくつかについて説明しました。

わかりやすくするためにシンプルにしていますが、同時に、より強力なプラグインを作成する方法に関する必要な情報を含むいくつかの便利なリンクを提供しています。

いつものように、例の完全なソースコードは、GitHubから入手できます。