Podstawowym problemem jest tutaj możliwość współdzielenia pewnego stanu między dwa różne cele wtyczki:start
cel, który uruchomi proces, a następnie stop
cel, który by go zabił. Dobrym sposobem na to jest skorzystanie z ContextEnabled
interfejs, który implementują wszystkie mojo. Zapewnia getPluginContext()
metoda, która zwraca (surową) mapę, w której możesz przechowywać obiekty, które mają być udostępniane między mojos.
Dzięki takiemu podejściu możesz przechowywać coś, co stworzyłeś w start
celu wtyczki i odzyskaj go w stop
bramka. Oto minimalistyczny przykład pokazujący to w działaniu, w którym prosta wartość ciągu jest dzielona między mojos.
Skonfiguruj projekt wtyczki Maven . Zasadniczo sprowadza się to do posiadania projektu z następującym POM, który jest standardowym POM dla wtyczki Maven, przy użyciu Javy 8 i adnotacji do konfiguracji:
<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>
Zwróć uwagę na opakowanie typu maven-plugin
który deklaruje Mavenowi, że jest to projekt wtyczki. W tym nowym projekcie rozważ następujące 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"));
}
}
Jest to deklaracja nowego start
mojo
który jest domyślnie powiązany z pre-integration-test
faza. Pobiera kontekst wtyczki i umieszcza w nim nowy obiekt. W powyższym przykładzie jest to proste niestandardowe POJO o nazwie MyService
który przyjmuje wartość w swoim konstruktorze. Ten obiekt jest mapowany na klucz "myService"
, który służy jako odnośnik.
Wtedy możemy mieć:
@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());
}
}
To jest deklaracja nowego stop
mojo, który jest domyślnie powiązany z post-integration-test
faza. Pobiera kontekst wtyczki, wyodrębnia obiekt pod kluczem "myService"
, a na koniec pobierz jej wartość i zarejestruj ją.
Po spakowaniu i zainstalowaniu tej wtyczki Maven (z mvn clean install
) do lokalnego repozytorium, możesz go użyć w przykładowym projekcie za pomocą
<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>
Jeśli uruchomisz mvn clean verify
w tym przykładowym projekcie będziesz miał "foo"
wydrukowane w Twoich logach, w post-integration-test
faza. To pokazuje, że wartość została poprawnie ustawiona przez start
mojo, a następnie poprawnie pobierane przez stop
mojo.
Oczywiście na tej mapie możesz przechowywać złożone obiekty, a nie tylko String
(dla których mogłyby istnieć prostsze rozwiązania). Warto zauważyć, że może to być host dla twojego process
wystąpienie, które chcesz zatrzymać. Możesz pozbyć się wtyczki exec-maven-plugin
, utwórz nową wtyczkę Maven zawierającą kod, który już musisz skonfigurować, aby skonfigurować osadzoną bazę danych w start
celu, przechowuj instancję procesu w kontekście wtyczki w tym celu, a na koniec zatrzymaj ten proces później w innym stop
mojo, pobierając go z kontekstu wtyczki.