Il problema principale qui è essere in grado di condividere uno stato tra due diversi obiettivi di un plug-in:un start
obiettivo che avvierebbe un processo e quindi un stop
obiettivo che lo ucciderebbe. Un buon modo per farlo è utilizzare ContextEnabled
interfaccia implementata da tutti i mojo. Fornisce un getPluginContext()
metodo che restituisce una mappa (grezza), in cui puoi memorizzare oggetti da condividere tra mojo.
Con questo approccio, puoi memorizzare qualcosa che hai creato in start
obiettivo di un plug-in e recuperarlo in stop
obiettivo. Ecco un esempio minimalista per mostrarlo in azione, in cui un semplice valore String è condiviso tra i mojo.
Imposta un progetto di plug-in Maven . Ciò si riduce fondamentalmente ad avere un progetto con il seguente POM, che è il POM standard per un plug-in Maven, utilizzando Java 8 e annotazioni per la configurazione:
<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>
Nota la confezione di tipo maven-plugin
che dichiara a Maven che si tratta di un progetto di plugin. In questo nuovo progetto, considera il seguente 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"));
}
}
Questo sta dichiarando un nuovo start
mojo
che è vincolato per impostazione predefinita a pre-integration-test
fase. Recupera il contesto del plugin e vi inserisce un nuovo oggetto. In quanto sopra, è un semplice POJO personalizzato chiamato MyService
che assume un valore nel suo costruttore. Questo oggetto è mappato su una chiave di "myService"
, che funge da ricerca.
Quindi, possiamo avere:
@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());
}
}
Questo sta dichiarando un nuovo stop
mojo che è vincolato per impostazione predefinita a post-integration-test
fase. Recupera il contesto del plugin, estrae l'oggetto sotto la chiave "myService"
, e infine ottieni il suo valore e lo registra.
Dopo aver impacchettato e installato questo plugin Maven (con mvn clean install
) nel tuo repository locale, puoi utilizzarlo in un progetto di esempio con
<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>
Se esegui mvn clean verify
su quel progetto di esempio, finirai per avere "foo"
stampato nei tuoi log, nel post-integration-test
fase. Questo mostra che il valore è stato impostato correttamente da start
mojo, e poi correttamente recuperato da stop
mojo.
Ovviamente puoi memorizzare oggetti complessi in questa mappa, non solo una String
(per il quale potrebbero esserci soluzioni più semplici). In particolare, potrebbe essere un host per il tuo process
istanza che si desidera interrompere. Puoi sbarazzarti del exec-maven-plugin
, crea un nuovo plugin Maven contenente il codice che ti serve già per configurare il database incorporato in un start
obiettivo, archiviare l'istanza del processo nel contesto del plug-in in questo obiettivo e infine interrompere questo processo in un secondo momento in un altro stop
mojo recuperandolo dal contesto del plugin.