Kärnproblemet här är att kunna dela något tillstånd mellan två olika mål för ett plugin:en start
mål som skulle starta en process och sedan ett stop
mål som skulle döda den. Ett bra sätt att göra det är att använda ContextEnabled
gränssnitt som alla mojos implementerar. Den tillhandahåller en getPluginContext()
metod som returnerar en (rå) karta, där du kan lagra objekt som ska delas mellan mojos.
Med detta tillvägagångssätt kan du lagra något du skapat i start
målet för ett plugin, och få tillbaka det i stop
mål. Här är ett minimalistiskt exempel för att visa detta i praktiken, där ett enkelt strängvärde delas mellan mojos.
Konfigurera ett Maven-pluginprojekt . Detta handlar i princip om att ha ett projekt med följande POM, som är standard-POM för en Maven-plugin, med Java 8 och anteckningar för konfiguration:
<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>
Notera förpackningen av typen maven-plugin
som förklarar för Maven att detta är ett plugin-projekt. I det här nya projektet, överväg följande 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"));
}
}
Detta deklarerar en ny start
mojo
som som standard är bunden till pre-integration-test
fas. Den hämtar pluginkontexten och lägger in ett nytt objekt i det. I ovanstående är det en enkel anpassad POJO som heter MyService
som tar ett värde i sin konstruktor. Detta objekt är mappat till nyckeln "myService"
, som fungerar som uppslag.
Då kan vi ha:
@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());
}
}
Detta deklarerar ett nytt stop
mojo som som standard är bunden till post-integration-test
fas. Den hämtar pluginkontexten, extraherar objektet under nyckeln "myService"
, och slutligen få dess värde och logga det.
Efter att ha packat och installerat detta Maven-plugin (med mvn clean install
) i din lokala repo kan du använda den i ett exempelprojekt med
<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>
Om du kör mvn clean verify
på det exempelprojektet kommer du att ha "foo"
skrivs ut i dina loggar, i post-integration-test
fas. Detta visar att värdet var korrekt inställt av start
mojo, och sedan korrekt hämtad av stop
mojo.
Naturligtvis kan du lagra komplexa objekt i den här kartan, inte bara en String
(som det skulle kunna finnas enklare lösningar för). Särskilt kan det vara en värd för din process
exempel som du vill stoppa. Du kan bli av med exec-maven-plugin
, skapa ett nytt Maven-plugin som innehåller koden du redan har för att ställa in den inbäddade databasen i en start
mål, lagra processinstansen i plugin-sammanhanget i detta mål, och slutligen stoppa denna process senare i ett annat stop
mojo genom att hämta den från plugin-kontexten.