Masalah inti di sini, adalah untuk dapat berbagi beberapa status antara dua tujuan yang berbeda dari sebuah plugin:start
tujuan yang akan meluncurkan proses, dan kemudian stop
tujuan yang akan membunuhnya. Cara yang baik untuk melakukannya adalah dengan menggunakan ContextEnabled
antarmuka yang diimplementasikan oleh semua mojo. Ini menyediakan getPluginContext()
metode yang mengembalikan peta (mentah), tempat Anda dapat menyimpan objek untuk dibagikan di antara mojo.
Dengan pendekatan ini, Anda dapat menyimpan sesuatu yang Anda buat di start
tujuan plugin, dan dapatkan kembali di stop
sasaran. Berikut adalah contoh minimalis untuk menunjukkan ini dalam tindakan, di mana nilai String sederhana dibagikan di antara mojo.
Menyiapkan proyek plugin Maven . Ini pada dasarnya bermuara pada memiliki proyek dengan POM berikut, yang merupakan POM standar untuk plugin Maven, menggunakan Java 8 dan anotasi untuk konfigurasi:
<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>
Perhatikan kemasan jenis maven-plugin
yang menyatakan kepada Maven bahwa ini adalah proyek plugin. Dalam proyek baru ini, pertimbangkan StartMojo
berikut ini :
@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"));
}
}
Ini mendeklarasikan start
mojo
yang terikat secara default ke pre-integration-test
fase. Ini mengambil konteks plugin dan menempatkan objek baru di dalamnya. Di atas, ini adalah POJO kustom sederhana yang disebut MyService
yang mengambil nilai dalam konstruktornya. Objek ini dipetakan ke kunci "myService"
, yang berfungsi sebagai pencarian.
Kemudian, kita dapat memiliki:
@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());
}
}
Ini mendeklarasikan stop
baru mojo yang terikat secara default ke post-integration-test
fase. Ini mengambil konteks plugin, mengekstrak objek di bawah kunci "myService"
, dan akhirnya mendapatkan nilainya dan mencatatnya.
Setelah mengemas dan menginstal plugin Maven ini (dengan mvn clean install
) ke dalam repo lokal Anda, Anda dapat menggunakannya dalam proyek sampel dengan
<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>
Jika Anda menjalankan mvn clean verify
pada proyek sampel itu, Anda akan mendapatkan "foo"
dicetak di log Anda, di post-integration-test
fase. Ini menunjukkan bahwa nilai telah diatur dengan benar oleh start
mojo, dan kemudian diambil dengan benar oleh stop
mojo.
Tentu saja, Anda dapat menyimpan objek kompleks di peta ini, bukan hanya String
(yang mungkin ada solusi yang lebih sederhana). Khususnya, ini bisa menjadi host untuk process
Anda contoh yang ingin Anda hentikan. Anda dapat menyingkirkan exec-maven-plugin
, buat plugin Maven baru yang berisi kode yang sudah Anda miliki untuk menyiapkan basis data tertanam di start
tujuan, simpan instance proses dalam konteks plugin di tujuan ini, dan terakhir hentikan proses ini nanti di stop
lain mojo dengan mengambilnya dari konteks plugin.