Vấn đề cốt lõi ở đây là có thể chia sẻ một số trạng thái giữa hai mục tiêu khác nhau của một plugin:start
mục tiêu sẽ khởi chạy một quy trình và sau đó là stop
mục tiêu sẽ giết chết nó. Một cách tốt để làm điều đó là sử dụng ContextEnabled
giao diện mà tất cả các mojos triển khai. Nó cung cấp một getPluginContext()
phương thức trả về một bản đồ (thô), trong đó bạn có thể lưu trữ các đối tượng để chia sẻ giữa các mojos.
Với cách tiếp cận này, bạn có thể lưu trữ thứ gì đó bạn đã tạo trong start
mục tiêu của một plugin và lấy lại nó trong stop
mục tiêu. Dưới đây là một ví dụ tối giản để hiển thị điều này trong thực tế, trong đó giá trị Chuỗi đơn giản được chia sẻ giữa các mojos.
Thiết lập dự án plugin Maven . Về cơ bản, điều này xuất phát từ việc có một dự án với POM sau, là POM tiêu chuẩn cho một plugin Maven, sử dụng Java 8 và các chú thích cho cấu hình:
<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>
Lưu ý cách đóng gói của loại maven-plugin
tuyên bố với Maven rằng đây là một dự án plugin. Trong dự án mới này, hãy xem xét StartMojo
sau :
@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"));
}
}
Đây là khai báo mới start
mojo
được ràng buộc theo mặc định với pre-integration-test
giai đoạn. Nó lấy bối cảnh plugin và đặt một đối tượng mới vào đó. Ở trên, nó là một POJO tùy chỉnh đơn giản được gọi là MyService
nhận một giá trị trong hàm tạo của nó. Đối tượng này được ánh xạ tới một khóa của "myService"
, đóng vai trò như một tra cứu.
Sau đó, chúng ta có thể có:
@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());
}
}
Đây là khai báo một stop
mới mojo được ràng buộc theo mặc định với post-integration-test
giai đoạn. Nó truy xuất ngữ cảnh plugin, trích xuất đối tượng dưới khóa "myService"
và cuối cùng lấy giá trị của nó và ghi lại nó.
Sau khi đóng gói và cài đặt plugin Maven này (với mvn clean install
) vào repo cục bộ của bạn, bạn có thể sử dụng nó trong một dự án mẫu với
<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>
Nếu bạn chạy mvn clean verify
trong dự án mẫu đó, bạn sẽ có "foo"
được in trong nhật ký của bạn, trong post-integration-test
giai đoạn. Điều này cho thấy rằng giá trị đã được thiết lập chính xác bởi start
mojo, và sau đó được truy xuất chính xác bằng stop
mojo.
Tất nhiên, bạn có thể lưu trữ các đối tượng phức tạp trong bản đồ này, không chỉ là một String
(có thể có nhiều giải pháp đơn giản hơn). Đáng chú ý, nó có thể là máy chủ lưu trữ cho quá trình process
của bạn ví dụ mà bạn muốn dừng lại. Bạn có thể loại bỏ exec-maven-plugin
, tạo một plugin Maven mới chứa mã bạn đã có để thiết lập cơ sở dữ liệu nhúng trong start
mục tiêu, lưu trữ phiên bản quy trình trong ngữ cảnh plugin trong mục tiêu này và cuối cùng dừng quá trình này sau trong một stop
khác mojo bằng cách truy xuất nó từ ngữ cảnh plugin.