Het kernprobleem hier is om een staat te kunnen delen tussen twee verschillende doelen van een plug-in:een start
doel dat een proces zou starten, en dan een stop
doel dat het zou doden. Een goede manier om dat te doen is door gebruik te maken van de ContextEnabled
interface die alle mojo's implementeren. Het biedt een getPluginContext()
methode die een (onbewerkte) kaart retourneert, waarin je objecten kunt opslaan om te delen tussen mojo's.
Met deze aanpak kun je iets dat je hebt gemaakt opslaan in de start
doel van een plug-in, en krijg het terug in de stop
doel. Hier is een minimalistisch voorbeeld om dit in actie te laten zien, waarbij een eenvoudige String-waarde wordt gedeeld tussen mojo's.
Een Maven-plug-inproject opzetten . Dit komt in feite neer op het hebben van een project met de volgende POM, de standaard POM voor een Maven-plug-in, met Java 8 en annotaties voor configuratie:
<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>
Let op de verpakking van het type maven-plugin
die aan Maven verklaart dat dit een plug-inproject is. Overweeg in dit nieuwe project de volgende 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"));
}
}
Dit verklaart een nieuwe start
mojo
die standaard is gebonden aan de pre-integration-test
fase. Het haalt de plug-in-context op en plaatst er een nieuw object in. In het bovenstaande is het een eenvoudige aangepaste POJO genaamd MyService
die een waarde in zijn constructor neemt. Dit object is toegewezen aan een sleutel van "myService"
, die als opzoekfunctie dient.
Dan kunnen we hebben:
@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());
}
}
Dit is het declareren van een nieuwe stop
mojo die standaard is gebonden aan de post-integration-test
fase. Het haalt de plug-in-context op, extraheert het object onder de sleutel "myService"
, en krijg uiteindelijk de waarde en logt deze.
Na het inpakken en installeren van deze Maven-plug-in (met mvn clean install
) in uw lokale opslagplaats, kunt u het gebruiken in een voorbeeldproject met
<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>
Als u mvn clean verify
. uitvoert op dat voorbeeldproject krijg je uiteindelijk "foo"
afgedrukt in uw logboeken, in de post-integration-test
fase. Dit geeft aan dat de waarde correct is ingesteld door de start
mojo, en vervolgens correct opgehaald door de stop
mojo.
Natuurlijk kun je complexe objecten op deze kaart opslaan, niet alleen een String
(waarvoor er meer eenvoudige oplossingen zouden kunnen zijn). Het kan met name een host zijn voor uw process
voorbeeld dat u wilt stoppen. U kunt de exec-maven-plugin
. verwijderen , maak een nieuwe Maven-plug-in met de code die u al hebt om de ingesloten database in een start
in te stellen doel, sla de procesinstantie op in de plug-incontext in dit doel en stop dit proces later in een andere stop
mojo door het op te halen uit de plug-in-context.