Maven Enforcerプラグイン

1. 概要

このチュートリアルでは、https://maven.apache.org/enforcer/maven-enforcer-plugin/ [Maven Enforcer Plugin]およびそれを使用してプロジェクトのコンプライアンスレベルを保証する方法について学習します。 。
このプラグインは、世界中に散らばったチームを分散している場合に特に便利です。

2. 依存

プロジェクトでプラグインを使用するには、_pom.xml_に次の依存関係を追加する必要があります。
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-enforcer-plugin</artifactId>
    <version>3.0.0-M2</version>
</plugin>
プラグインの最新バージョンはhttps://search.maven.org/search?q=a:maven-enforcer-plugin%20AND%20g:org.apache.maven.plugins[Maven Central]で入手できます。

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

Maven Enforcerには2つの目標があります。__enforcer:enforce ___ and__enforcer:display-info._
__enforce __goalは、プロジェクトビルド中に実行され、構成で指定されたルールを実行します。一方、_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_は、従うべきルールの存在を微妙に示唆します。 これが、Maven Enforcerプラグインの仕組みです。 プロジェクトのビルドフェーズ中に実施されるいくつかのルールで構成します。
このセクションでは、プロジェクトの品質を高めるためにプロジェクトに適用できる利用可能なルールを見ていきます。

* 4.1。 重複依存の禁止*

_POM_間に親子関係が存在するマルチモジュールプロジェクトでは、プロジェクトの有効な最終_POM_に依存関係の重複がないことを確認するのは難しい作業です。 しかし、_banDuplicatePomDependencyVersions_ルールを使用すると、プロジェクトにこのような不具合がないことを簡単に確認できます。
行う必要があるのは、_banDuplicatePomDependencyVersions_タグをプラグイン構成の_rules_セクションに追加することだけです。
...
<rules>
    <banDuplicatePomDependencyVersions/>
</rules>
...
ルールの動作を確認するには、_pom.xml_で1つの依存関係を複製し、__mvn clean compileを実行します。 __コンソールに次のエラー行が生成されます。
...
[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>
これにより、プラグインのhttps://maven.apache.org/enforcer/enforcer-rules/versionRanges.html [バージョン範囲指定パターン]に準拠している限り、バージョン番号を柔軟に指定できます。
さらに、両方のルールは、カスタムメッセージを指定するための_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プラグインには多くのhttps://maven.apache.org/enforcer/enforcer-rules/index.html [その他のルール]があり、開発環境に関係なくプロジェクトの品質と一貫性を促進します。
また、プラグインには、現在構成されているいくつかのルールに関する情報を表示するコマンドがあります。
mvn enforcer:display-info

5. カスタムルール

これまで、プラグインの組み込みルールを調査してきました。 ここで、独自のカスタムルールの作成を見てみましょう。
最初に、カスタムルールを含む新しいJavaプロジェクトを作成する必要があります。 カスタムルールとは、__EnforceRule that__interfaceを実装し、__ execute()__method *をオーバーライドするクラス_Object_です。
public void execute(EnforcerRuleHelper enforcerRuleHelper) throws EnforcerRuleException {
    try {
        String groupId = (String) enforcerRuleHelper.evaluate("${project.groupId}");
        if (groupId == null || !groupId.startsWith("org.baeldung")) {
            throw new EnforcerRuleException("Project group id does not start with org.baeldung");
        }
    }
    catch (ExpressionEvaluationException ex) {
        throw new EnforcerRuleException( "Unable to lookup an expression "
          + ex.getLocalizedMessage(), ex );
    }
}
カスタムルールは、ターゲットプロジェクトの_groupId_が_org.baeldung_で始まるかどうかを確認するだけです。
ルールが満たされていないことを示すために_boolean_などを返す必要がないことに注意してください。 何が間違っているかを説明した__EnforcerRuleException __をスローします。
  • Maven Enforcerプラグインへの依存関係として追加することにより、カスタムルールを使用できます*:

...
<rules>
    <myCustomRule implementation="com.baeldung.enforcer.MyCustomRule"/>
</rules>
...
カスタムルールプロジェクトがMaven Centralで公開されたアーティファクトではない場合、_mvn clean install._を実行することで、ローカルのMavenリポジトリにインストールできることに注意してください。
これにより、Maven Enforcerプラグインを含むターゲットプロジェクトをコンパイルするときに使用できるようになります。 詳しくは、プラグインのhttps://maven.apache.org/enforcer/enforcer-api/writing-a-custom-rule.html [カスタムルールのドキュメント]をご覧ください。
*動作を確認するには、Enforcerプラグインを使用してプロジェクトの_groupId_プロパティを「org.baeldung」以外に設定し、_mvn clean compile_。を実行します。*

6. 結論

このクイックチュートリアルでは、Maven Enforcerプラグインが既存のプラグインのチェストにどのように役立つかを説明しました。 カスタムルールを記述する機能により、アプリケーションの範囲が広がります。
https://github.com/eugenp/tutorials/tree/master/maven[over on GitHub]にある完全なサンプルソースコードのカスタムルールサンプルの依存関係とルールのコメントを外す必要があることに注意してください。