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="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>
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.