Hlavním problémem je zde možnost sdílet nějaký stav mezi dvěma různými cíli pluginu:start cíl, který spustí proces, a poté stop cíl, který by to zabil. Dobrým způsobem, jak toho dosáhnout, je využít ContextEnabled
rozhraní, které implementují všechny mojos. Poskytuje getPluginContext()
metoda, která vrací (surovou) mapu, ve které můžete ukládat objekty, které mají být sdíleny mezi mojos.
S tímto přístupem můžete uložit něco, co jste vytvořili v start cíl pluginu a získat jej zpět v stop fotbalová branka. Zde je minimalistický příklad, který to ukáže v akci, kde je mezi mojos sdílená jednoduchá hodnota String.
Nastavit projekt pluginu Maven . V podstatě jde o to mít projekt s následujícím POM, což je standardní POM pro plugin Maven, používající Java 8 a anotace pro konfiguraci:
<project xmlns="https://maven.apache.org/POM/4.0.0" xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="https://maven.apache.org/POM/4.0.0 https://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>
Všimněte si balení typu maven-plugin což Mavenovi prohlašuje, že se jedná o projekt pluginu. V tomto novém projektu zvažte následující 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"));
}
}
Toto deklaruje nový start mojo
který je ve výchozím nastavení vázán na pre-integration-test
fáze. Načte kontext pluginu a vloží do něj nový objekt. Ve výše uvedeném je to jednoduché vlastní POJO s názvem MyService který nabývá hodnoty ve svém konstruktoru. Tento objekt je namapován na klíč "myService" , který slouží jako vyhledávací.
Pak můžeme mít:
@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());
}
}
Toto je deklarování nového stop mojo, který je ve výchozím nastavení vázán na post-integration-test
fáze. Získá kontext pluginu, extrahuje objekt pod klíčem "myService" a nakonec získat jeho hodnotu a zaprotokolovat ji.
Po zabalení a instalaci tohoto pluginu Maven (s mvn clean install ) do místního úložiště, můžete jej použít ve vzorovém projektu s
<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>
Pokud spustíte mvn clean verify v tomto ukázkovém projektu skončíte s "foo" vytištěno ve vašich protokolech v post-integration-test fáze. To ukazuje, že hodnota byla správně nastavena pomocí start mojo a poté správně načteno pomocí stop mojo.
Do této mapy můžete samozřejmě ukládat složité objekty, nejen String (pro které by mohlo být jednodušších řešení). Zejména to může být hostitel pro váš process případ, který chcete zastavit. Můžete se zbavit exec-maven-plugin , vytvořte nový plugin Maven obsahující kód, který již máte k nastavení vestavěné databáze v start cíl, uložte instanci procesu v kontextu pluginu v tomto cíli a nakonec tento proces zastavte později v jiném stop mojo jeho načtením z kontextu pluginu.