Kerneproblemet her er at være i stand til at dele en tilstand mellem to forskellige mål for et plugin:en start
mål, der ville starte en proces og derefter et stop
mål, der ville dræbe den. En god måde at gøre det på er at gøre brug af ContextEnabled
grænseflade, som alle mojos implementerer. Det giver en getPluginContext()
metode, der returnerer et (rå) kort, hvor du kan gemme objekter, der skal deles mellem mojos.
Med denne tilgang kan du gemme noget, du har oprettet i start
mål for et plugin, og få det tilbage i stop
mål. Her er et minimalistisk eksempel for at vise dette i aktion, hvor en simpel strengværdi deles mellem mojos.
Opsæt et Maven plugin-projekt . Dette kommer dybest set ned til at have et projekt med følgende POM, som er standard POM for et Maven plugin, ved hjælp af Java 8 og annoteringer til 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>
Bemærk emballagen af typen maven-plugin
som erklærer til Maven, at dette er et plugin-projekt. I dette nye projekt skal du overveje følgende 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"));
}
}
Dette erklærer en ny start
mojo
som som standard er bundet til pre-integration-test
fase. Den henter plugin-konteksten og sætter et nyt objekt i den. I ovenstående er det en simpel brugerdefineret POJO kaldet MyService
som tager en værdi i sin konstruktør. Dette objekt er knyttet til en nøgle af "myService"
, som fungerer som opslag.
Så kan vi have:
@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());
}
}
Dette erklærer et nyt stop
mojo, som som standard er bundet til post-integration-test
fase. Den henter plugin-konteksten, udtrækker objektet under nøglen "myService"
, og endelig få dens værdi og logge den.
Efter pakning og installation af dette Maven-plugin (med mvn clean install
) ind i din lokale repo, kan du bruge den i et eksempelprojekt 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>
Hvis du kører mvn clean verify
på det eksempelprojekt vil du ende med at have "foo"
udskrevet i dine logfiler, i post-integration-test
fase. Dette viser, at værdien var korrekt indstillet af start
mojo, og derefter korrekt hentet af stop
mojo.
Selvfølgelig kan du gemme komplekse objekter i dette kort, ikke kun en String
(hvilket der kunne være mere simple løsninger til). Det kan især være en vært for din process
eksempel, du vil stoppe. Du kan slippe af med exec-maven-plugin
, opret et nyt Maven-plugin, der indeholder den kode, du allerede har til at opsætte den indlejrede database i en start
mål, gem procesforekomsten i plugin-konteksten i dette mål, og stop endelig denne proces senere i et andet stop
mojo ved at hente det fra plugin-konteksten.