Основният проблем тук е да можете да споделяте някакво състояние между две различни цели на плъгин:start
цел, която би стартирала процес и след това stop
гол, който би го убил. Добър начин да направите това е да използвате ContextEnabled
интерфейс, който всички mojos изпълняват. Той предоставя getPluginContext()
метод, който връща (сурова) карта, в която можете да съхранявате обекти, които да се споделят между mojos.
С този подход можете да съхранявате нещо, което сте създали в start
цел на плъгин и го върнете обратно в stop
цел. Ето минималистичен пример, който показва това в действие, където проста стойност на низ се споделя между mojos.
Настройване на проект за плъгин на Maven . Това основно се свежда до наличието на проект със следния POM, който е стандартният POM за плъгин Maven, използващ Java 8 и анотации за конфигурация:
<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>
Обърнете внимание на опаковката от тип maven-plugin
който декларира на Maven, че това е плъгин проект. В този нов проект разгледайте следното 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"));
}
}
Това декларира нов start
моджо
който е обвързан по подразбиране към pre-integration-test
фаза. Той извлича контекста на плъгина и поставя нов обект в него. В горното това е просто персонализирано POJO, наречено MyService
който приема стойност в своя конструктор. Този обект е съпоставен с ключ на "myService"
, който служи за търсене.
Тогава можем да имаме:
@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());
}
}
Това декларира ново stop
mojo, който е обвързан по подразбиране към post-integration-test
фаза. Той извлича контекста на приставката, извлича обекта под ключа "myService"
, и накрая получава неговата стойност и я регистрира.
След опаковането и инсталирането на този плъгин Maven (с mvn clean install
) във вашето локално репо, можете да го използвате в примерен проект с
<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>
Ако стартирате mvn clean verify
в този примерен проект в крайна сметка ще имате "foo"
отпечатани във вашите регистрационни файлове, в post-integration-test
фаза. Това показва, че стойността е правилно зададена от start
mojo и след това правилно извлечен от stop
моджо.
Разбира се, можете да съхранявате сложни обекти в тази карта, а не само String
(за което може да има по-прости решения). За отбелязване е, че може да бъде хост за вашия process
случай, който искате да спрете. Можете да се отървете от exec-maven-plugin
, създайте нов плъгин Maven, съдържащ кода, който вече имате, за да настроите вградената база данни в start
цел, съхранете екземпляра на процеса в контекста на приставката в тази цел и накрая спрете този процес по-късно в друга stop
mojo, като го извлечете от контекста на приставката.