Le problème central ici est de pouvoir partager un état entre deux objectifs différents d'un plugin :un start
goal qui lancerait un processus, puis un stop
but qui le tuerait. Une bonne façon de le faire est d'utiliser le ContextEnabled
interface que tous les mojos implémentent. Il fournit un getPluginContext()
méthode qui renvoie une carte (brute), dans laquelle vous pouvez stocker des objets à partager entre mojos.
Avec cette approche, vous pouvez stocker quelque chose que vous avez créé dans le start
objectif d'un plugin, et le récupérer dans le stop
objectif. Voici un exemple minimaliste pour montrer cela en action, où une simple valeur String est partagée entre les mojos.
Configurer un projet de plugin Maven . Cela revient essentiellement à avoir un projet avec le POM suivant, qui est le POM standard pour un plugin Maven, utilisant Java 8 et des annotations pour la configuration :
<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>
Notez le packaging de type maven-plugin
qui déclare à Maven qu'il s'agit d'un projet de plugin. Dans ce nouveau projet, considérez le suivant 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"));
}
}
Ceci déclare un nouveau start
mojo
qui est lié par défaut au pre-integration-test
phase. Il récupère le contexte du plugin et y place un nouvel objet. Dans ce qui précède, il s'agit d'un simple POJO personnalisé appelé MyService
qui prend une valeur dans son constructeur. Cet objet est mappé à une clé de "myService"
, qui sert de recherche.
Alors, on peut avoir :
@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());
}
}
Ceci déclare un nouveau stop
mojo qui est lié par défaut au post-integration-test
phase. Il récupère le contexte du plugin, extrait l'objet sous la clé "myService"
, et enfin obtenir sa valeur et l'enregistrer.
Après avoir empaqueté et installé ce plugin Maven (avec mvn clean install
) dans votre référentiel local, vous pouvez l'utiliser dans un exemple de projet avec
<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>
Si vous exécutez mvn clean verify
sur cet exemple de projet, vous finirez par avoir "foo"
imprimé dans vos logs, dans le post-integration-test
phase. Cela montre que la valeur a été correctement configurée par le start
mojo, puis récupéré correctement par le stop
mojo.
Bien sûr, vous pouvez stocker des objets complexes dans cette carte, pas seulement une String
(pour lesquels il pourrait y avoir des solutions plus simples). Notamment, il pourrait être un hôte pour votre process
instance que vous souhaitez arrêter. Vous pouvez vous débarrasser du exec-maven-plugin
, créez un nouveau plugin Maven contenant le code que vous avez déjà pour configurer la base de données embarquée dans un start
goal, stocker l'instance de processus dans le contexte du plugin dans ce goal, et enfin arrêter ce processus plus tard dans un autre stop
mojo en le récupérant depuis le contexte du plugin.