ここでの中心的な問題は、プラグインの2つの異なる目標間でいくつかの状態を共有できるようにすることです:start
プロセスを起動し、次にstop
する目標 それを殺すゴール。そのための良い方法は、 ContextEnabled
すべてのmojoが実装するインターフェース。 getPluginContext()
モジョ間で共有するオブジェクトを格納できる(生の)マップを返すメソッド。
このアプローチでは、作成したものをstart
に保存できます。 プラグインの目標を達成し、stop
に戻します ゴール。これを実際に示すための最小限の例を次に示します。ここでは、単純な文字列値がmojo間で共有されています。
Mavenプラグインプロジェクトを設定する 。これは基本的に、Java 8と構成用のアノテーションを使用して、Mavenプラグインの標準POMである次のPOMを持つプロジェクトを持つことになります。
<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>sample.plugin</groupId>
<artifactId>test-maven-plugin</artifactId>
<version>1.0.0</version>
<packaging>maven-plugin</packaging>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<build>
<plugins>
<plugin>
<artifactId>maven-plugin-plugin</artifactId>
<version>3.5</version>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-plugin-api</artifactId>
<version>3.3.9</version>
</dependency>
<!-- dependencies to annotations -->
<dependency>
<groupId>org.apache.maven.plugin-tools</groupId>
<artifactId>maven-plugin-annotations</artifactId>
<version>3.4</version>
<scope>provided</scope>
</dependency>
</dependencies>
</project>
タイプmaven-plugin
のパッケージに注意してください これは、これがプラグインプロジェクトであることをMavenに宣言します。この新しいプロジェクトでは、次のStartMojo
を検討してください。 :
@Mojo(name = "start", defaultPhase = LifecyclePhase.PRE_INTEGRATION_TEST)
public class StartMojo extends AbstractMojo {
@SuppressWarnings("unchecked")
@Override
public void execute() throws MojoExecutionException {
getPluginContext().put("myService", new MyService("foo"));
}
}
これは、新しいstart
モジョ
これはデフォルトでpre-integration-test
段階。プラグインコンテキストを取得し、それに新しいオブジェクトを配置します。上記では、これはMyService
と呼ばれる単純なカスタムPOJOです。 これはコンストラクターで値を取ります。このオブジェクトは、"myService"
のキーにマップされています 、ルックアップとして機能します。
次に、次のことができます。
@Mojo(name = "stop", defaultPhase = LifecyclePhase.POST_INTEGRATION_TEST)
public class StopMojo extends AbstractMojo {
@Override
public void execute() throws MojoExecutionException {
MyService service = (MyService) getPluginContext().get("myService");
getLog().info(service.getValue());
}
}
これは、新しいstop
を宣言しています。 デフォルトでpost-integration-test
段階。プラグインコンテキストを取得し、キー"myService"
の下のオブジェクトを抽出します 、そして最後にその値を取得してログに記録します。
このMavenプラグインをパッケージ化してインストールした後(mvn clean install
を使用) )ローカルリポジトリに、サンプルプロジェクトで使用できます
<plugin>
<groupId>sample.plugin</groupId>
<artifactId>test-maven-plugin</artifactId>
<executions>
<execution>
<id>sample</id>
<goals>
<goal>start</goal>
<goal>stop</goal>
</goals>
</execution>
</executions>
</plugin>
mvn clean verify
を実行する場合 そのサンプルプロジェクトでは、最終的に"foo"
になります。 ログのpost-integration-test
に出力されます 段階。これは、値がstart
によって正しく設定されたことを示しています。 mojo、そしてstop
によって正しく取得されます モジョ。
もちろん、String
だけでなく、複雑なオブジェクトをこのマップに格納できます。 (より簡単な解決策があるかもしれません)。特に、process
のホストになる可能性があります 停止したいインスタンス。 exec-maven-plugin
を取り除くことができます 、start
で組み込みデータベースをセットアップするためにすでに必要なコードを含む新しいMavenプラグインを作成します 目標、この目標のプラグインコンテキストにプロセスインスタンスを保存し、最後に別のstop
でこのプロセスを停止します プラグインコンテキストから取得することでmojo。