Das Kernproblem hier ist, einen Zustand zwischen zwei verschiedenen Zielen eines Plugins teilen zu können:einem start
Ziel, das einen Prozess starten würde, und dann ein stop
Ziel, das es töten würde. Eine gute Möglichkeit, dies zu tun, ist die Verwendung des ContextEnabled
Schnittstelle, die alle mojos implementieren. Es bietet einen getPluginContext()
Methode, die eine (rohe) Karte zurückgibt, in der Sie Objekte speichern können, die von Mojos geteilt werden sollen.
Mit diesem Ansatz können Sie etwas, das Sie erstellt haben, im start
speichern Ziel eines Plugins, und bringe es zurück in den stop
Tor. Hier ist ein minimalistisches Beispiel, um dies in Aktion zu zeigen, wo ein einfacher String-Wert von Mojos geteilt wird.
Ein Maven-Plugin-Projekt einrichten . Dies läuft im Grunde darauf hinaus, ein Projekt mit dem folgenden POM zu haben, das das Standard-POM für ein Maven-Plug-in ist, das Java 8 und Anmerkungen für die Konfiguration verwendet:
<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>
Beachten Sie die Verpackung des Typs maven-plugin
die Maven erklärt, dass dies ein Plugin-Projekt ist. Betrachten Sie in diesem neuen Projekt das folgende 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"));
}
}
Dies deklariert einen neuen start
mojo
die standardmäßig an pre-integration-test
Phase. Es ruft den Plugin-Kontext ab und fügt ein neues Objekt darin ein. Oben ist es ein einfaches benutzerdefiniertes POJO namens MyService
die einen Wert in ihrem Konstruktor annimmt. Dieses Objekt wird einem Schlüssel von "myService"
zugeordnet , die als Nachschlagewerk dient.
Dann können wir haben:
@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());
}
}
Dies erklärt einen neuen stop
mojo, das standardmäßig an post-integration-test
Phase. Es ruft den Plugin-Kontext ab, extrahiert das Objekt unter dem Schlüssel "myService"
, und erhält schließlich seinen Wert und protokolliert ihn.
Nach dem Packen und Installieren dieses Maven-Plugins (mit mvn clean install
) in Ihr lokales Repo, können Sie es in einem Beispielprojekt mit verwenden
<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>
Wenn Sie mvn clean verify
ausführen Bei diesem Beispielprojekt erhalten Sie am Ende "foo"
gedruckt in Ihren Protokollen, im post-integration-test
Phase. Dies zeigt, dass der Wert vom start
korrekt eingerichtet wurde mojo, und dann vom stop
korrekt abgerufen mojo.
Natürlich können Sie in dieser Karte auch komplexe Objekte speichern, nicht nur einen String
(für die es einfachere Lösungen geben könnte). Insbesondere könnte es ein Host für Ihren process
sein Instanz, die Sie stoppen möchten. Sie können das exec-maven-plugin
loswerden , erstellen Sie ein neues Maven-Plugin, das den Code enthält, den Sie bereits zum Einrichten der eingebetteten Datenbank in einem start
benötigen Ziel, speichern Sie die Prozessinstanz im Plugin-Kontext in diesem Ziel und stoppen Sie diesen Prozess später in einem weiteren stop
mojo durch Abrufen aus dem Plugin-Kontext.