यहां मुख्य समस्या प्लगइन के दो अलग-अलग लक्ष्यों के बीच कुछ स्थिति साझा करने में सक्षम होना है:एक start
लक्ष्य जो एक प्रक्रिया शुरू करेगा, और फिर एक stop
लक्ष्य जो इसे मार देगा। ऐसा करने का एक अच्छा तरीका ContextEnabled
इंटरफ़ेस जो सभी मोजो लागू करते हैं। यह एक getPluginContext()
विधि जो एक (कच्चा) नक्शा लौटाती है, जिसमें आप वस्तुओं को मोजो के बीच साझा करने के लिए संग्रहीत कर सकते हैं।
इस दृष्टिकोण के साथ, आप अपने द्वारा बनाई गई किसी चीज़ को start
. में संग्रहीत कर सकते हैं एक प्लगइन का लक्ष्य, और इसे वापस stop
. में प्राप्त करें लक्ष्य। इसे क्रिया में दिखाने के लिए यहां एक सरल उदाहरण दिया गया है, जहां मोजो के बीच एक साधारण स्ट्रिंग मान साझा किया जाता है।
Maven प्लगइन प्रोजेक्ट सेट करें . यह मूल रूप से निम्नलिखित पीओएम के साथ एक प्रोजेक्ट रखने के लिए नीचे आता है, जो जावा 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
type प्रकार की पैकेजिंग पर ध्यान दें जो मेवेन को घोषित करता है कि यह एक प्लगइन प्रोजेक्ट है। इस नए प्रोजेक्ट में, निम्नलिखित पर विचार करें 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"
. के तहत निकालता है , और अंत में इसका मान प्राप्त करें और इसे लॉग करें।
इस मावेन प्लगइन को पैकेजिंग और इंस्टॉल करने के बाद (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
run चलाते हैं उस नमूना प्रोजेक्ट पर, आपके पास "foo"
. होगा post-integration-test
. में आपके लॉग में प्रिंट किया गया अवस्था। इससे पता चलता है कि start
. द्वारा मान सही ढंग से सेट-अप किया गया था mojo, और फिर stop
. द्वारा सही ढंग से पुनर्प्राप्त किया गया मोजो।
बेशक, आप इस मानचित्र में जटिल वस्तुओं को संग्रहीत कर सकते हैं, न कि केवल एक String
(जिसके लिए और अधिक सरल उपाय हो सकते हैं)। विशेष रूप से, यह आपकी process
. के लिए एक होस्ट हो सकता है उदाहरण है कि आप रोकना चाहते हैं। आप exec-maven-plugin
से छुटकारा पा सकते हैं , एक नया मावेन प्लगइन बनाएं जिसमें वह कोड हो जिसमें आपको पहले से एम्बेडेड डेटाबेस को start
में सेट करना होगा लक्ष्य, इस लक्ष्य में प्लगइन संदर्भ में प्रक्रिया उदाहरण संग्रहीत करें, और अंत में इस प्रक्रिया को बाद में एक और stop
में रोकें मोजो को प्लगइन संदर्भ से पुनर्प्राप्त करके।