1. 概要

このチュートリアルでは、 Maven Enforcerプラグインと、それを使用してプロジェクトのコンプライアンスレベルを保証する方法について学習します。

プラグインは、世界中に散らばっているチームを分散させている場合に特に便利です。

2. 依存

プロジェクトでプラグインを使用するには、pom.xmlに次の依存関係を追加する必要があります。

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-enforcer-plugin</artifactId>
    <version>3.0.0-M2</version>
</plugin>

プラグインの最新バージョンは、 MavenCentralで入手できます。

3. プラグインの構成と目標

Maven Enforcerには、 enforcer:enforceenforcer:display-info。の2つの目標があります。

は、プロジェクトのビルド中にゴールを実行して、構成で指定されたルールを実行します。 display-info ゴールは、プロジェクトのpom.xml

executionsタグでenforceの目標を定義しましょう。 さらに、プロジェクトのrules定義を保持するconfigurationタグを追加します。

...
<executions>
    <execution>
        <id>enforce</id>
        <goals>
            <goal>enforce</goal>
        </goals>
        <configuration>
            <rules>
                <banDuplicatePomDependencyVersions/>
            </rules>
        </configuration>
    </execution>
</executions>
...

4. Mavenエンフォーサールール

キーワードenforceは、従うべきルールの存在を微妙に示唆しています。 これがMavenEnforcerプラグインの仕組みです。 プロジェクトのビルドフェーズ中に適用されるいくつかのルールを使用して構成します。

このセクションでは、プロジェクトの品質を向上させるためにプロジェクトに適用できる利用可能なルールを見ていきます。

4.1. 重複する依存関係を禁止する

POM 間に親子関係が存在するマルチモジュールプロジェクトでは、プロジェクトの有効な最終POMに依存関係の重複がないことを確認するのは難しい作業になる可能性があります。 ただし、 banDuplicatePomDependencyVersions ルールを使用すると、プロジェクトにこのような不具合がないことを簡単に確認できます。

プラグイン構成のrulesセクションにbanDuplicatePomDependencyVersionsタグを追加するだけです。

...
<rules>
    <banDuplicatePomDependencyVersions/>
</rules>
...

ルールの動作を確認するために、1つの依存関係を複製できます。 pom.xml 実行します mvnクリーンコンパイル。 コンソールに次のエラー行が表示されます。

...
[WARNING] Rule 0: org.apache.maven.plugins.enforcer.BanDuplicatePomDependencyVersions failed with message:
Found 1 duplicate dependency declaration in this project:
 - dependencies.dependency[io.vavr:vavr:jar] ( 2 times )

[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  1.370 s
[INFO] Finished at: 2019-02-19T10:17:57+01:00
...

4.2. MavenとJavaバージョンが必要

requireMavenVersionおよびrequireJavaVersionルールは、それぞれ、必要なMavenおよびJavaバージョンのプロジェクト全体のロックインを有効にします。 これは、開発環境で異なるバージョンのMavenとJDKを使用することから生じる可能性のある不一致を解消するのに役立ちます。

プラグイン構成のrulesセクションを更新しましょう。

<requireMavenVersion>
    <version>3.0</version>
</requireMavenVersion>
<requireJavaVersion>
    <version>1.8</version>
</requireJavaVersion>

これらにより、プラグインのバージョン範囲指定パターンに準拠している限り、柔軟な方法でバージョン番号を指定できます。

さらに、どちらのルールも、カスタムメッセージを指定するためのmessageパラメーターを受け入れます。

...
<requireMavenVersion>
    <version>3.0</version>
    <message>Invalid Maven version. It should, at least, be 3.0</message>
</requireMavenVersion>
...

4.3. 環境変数が必要

requireEnvironmentVariable ルールを使用すると、特定の環境変数が実行環境に設定されていることを確認できます。

複数の必要な変数に対応するために繰り返すことができます。

<requireEnvironmentVariable>
    <variableName>ui</variableName>
</requireEnvironmentVariable>
<requireEnvironmentVariable>
    <variableName>cook</variableName>
</requireEnvironmentVariable>

4.4. アクティブプロファイルが必要

Mavenのプロファイルは、アプリケーションがさまざまな環境にデプロイされたときにアクティブになるプロパティを構成するのに役立ちます。

したがって、1つ以上の指定されたプロファイルがアクティブであることを確認する必要がある場合は、 requireActiveProfile ルールを使用して、アプリケーションの正常な実行を保証できます。

<requireActiveProfile>
    <profiles>local,base</profiles>
    <message>Missing active profiles</message>
</requireActiveProfile>

上記のスニペットでは、 message プロパティを使用して、ルールチェックが失敗したかどうかを示すカスタムメッセージを提供しました。

4.5. その他の規則

Maven Enforcerプラグインには、開発環境に関係なくプロジェクトの品質と一貫性を促進するための多くのその他のルールがあります。

また、プラグインには、現在構成されているいくつかのルールに関する情報を表示するコマンドがあります。

mvn enforcer:display-info

5. カスタムルール

これまで、プラグインの組み込みルールを調査してきました。 次に、独自のカスタムルールの作成を検討します。

まず、カスタムルールを含む新しいJavaプロジェクトを作成する必要があります。 カスタムルールは、がEnforceRuleインターフェイスを実装し、execute()メソッドをオーバーライドするクラスObjectです。

public void execute(EnforcerRuleHelper enforcerRuleHelper) throws EnforcerRuleException {
    try {
        String groupId = (String) enforcerRuleHelper.evaluate("${project.groupId}");
        if (groupId == null || !groupId.startsWith("com.baeldung")) {
            throw new EnforcerRuleException("Project group id does not start with com.baeldung");
        }
    }
    catch (ExpressionEvaluationException ex) {
        throw new EnforcerRuleException( "Unable to lookup an expression " 
          + ex.getLocalizedMessage(), ex );
    }
}

カスタムルールは、ターゲットプロジェクトのgroupIdcom.baeldungで始まるかどうかをチェックするだけです。

ルールが満たされていないことを示すために、booleanなどを返す必要がないことに注意してください。 何が悪いのかを説明したEnforcerRuleExceptionをスローするだけです。

カスタムルールをMavenEnforcerプラグインへの依存関係として追加することで使用できます

...
<rules>
    <myCustomRule implementation="com.baeldung.enforcer.MyCustomRule"/>
</rules>
...

カスタムルールプロジェクトがMavenCentralで公開されたアーティファクトでない場合は、mvnクリーンインストールを実行してローカルのMavenリポジトリにインストールできることに注意してください。

これにより、MavenEnforcerプラグインを含むターゲットプロジェクトをコンパイルするときに使用できるようになります。 詳細については、プラグインのカスタムルールのドキュメントを参照してください。

実際の動作を確認するには、Enforcerプラグインを使用してプロジェクトの groupId プロパティを「com.baeldung」以外に設定し、 mvn cleancompileを実行します。

6. 結論

このクイックチュートリアルでは、MavenEnforcerプラグインが既存のプラグインのチェストにどのように役立つかを見てきました。 カスタムルールを作成する機能により、その適用範囲が広がります。

GitHub利用できる完全なサンプルソースコードのカスタムルールの例の依存関係とルールのコメントを解除する必要があることに注意してください。