2009-10-26 6 views
52

पर एक बहु-मॉड्यूल प्रोजेक्ट में, आप कैसे निर्दिष्ट कर सकते हैं कि आप सभी बच्चे-मॉड्यूल में प्लगइन लक्ष्य निष्पादित करना चाहते हैं, लेकिन मूल परियोजना पर नहीं? वहाँ <pluginManagement> है, लेकिन यह केवल निष्पादन के लिए विन्यास को परिभाषित करता है - बच्चे मॉड्यूल अभी भी लक्ष्य निष्पादित करने के लिए प्लगइन को संदर्भित करने की आवश्यकता होगी:बच्चे मॉड्यूल पर मेवेन प्लगइन लक्ष्य निष्पादित करें, लेकिन माता-पिता

[...] हालांकि, यह केवल प्लगइन्स हैं कि कॉन्फ़िगर करता है वास्तव में बच्चों में प्लगइन तत्व के भीतर संदर्भित। (POM Reference)

इस लक्ष्य को हासिल करने के लिए किसी भी अन्य तरीका है?

अद्यतन: मैं इस पास्कल की सलाह के अनुसार की कोशिश की है:

<!-- ... --> 
<packaging>pom</packaging> 
<modules> 
    <module>child</module> 
</modules> 

<build> 
    <plugins> 
    <plugin> 
     <artifactId>maven-jar-plugin</artifactId> 
     <executions> 
     <execution> 
     <phase>integration-test</phase> 
     <goals> 
      <goal>jar</goal> 
     </goals> 
     </execution> 
     </executions> 
    </plugin> 
    </plugins> 
</build> 
<!-- ... --> 

यह अभी भी, माता पिता परियोजना के लिए एक .jar उत्पन्न होगा, भले ही jar लक्ष्य integration-test चरण के लिए बाध्य है।

+1

नहीं तुम सिर्फ एक चरण है जो एक पोम-प्रकार परियोजना में मार डाला नहीं है (जो अपने माता पिता होना चाहिए करने के लिए इसे बाध्य कर सकते हैं ?) – falstro

+0

@roe मुझे लगता है कि आपकी टिप्पणी को उत्तर में बदल दिया जा सकता है :-) मैं जानना चाहता हूं, और मैं इसके लिए वोट दूंगा ;-) – KLE

+0

@KLE यह कोई जवाब नहीं था, मैं दिमागी तूफान की मदद करने की कोशिश कर रहा था। मुझे नहीं पता कि वास्तव में यह कैसे करना है। – falstro

उत्तर

23

Default Lifecycle Bindings के अनुसार, एक पैकेजिंग pom के लिए बाइंडिंग हैं:

डिफ़ॉल्ट जीवनचक्र बाइंडिंग - पैकेजिंग पोम

 
package  site:attach-descriptor 
install  install:install 
deploy  deploy:deploy 

तो अगर आपके माता-पिता पोम एक है <packaging>pom<packaging> (यह एक टिप्पणी में उल्लिखित मामला होना चाहिए) और यदि आप बांधते हैं उपरोक्त की तुलना में अन्य चरणों में आपके प्लगइन्स (विस्तृत सूची के लिए Lifecycle Reference देखें), वे मूल पीओएम के निर्माण के दौरान निष्पादित नहीं किए जाएंगे।

(संपादित करें: मेरी प्रारंभिक जवाब सिर्फ गलत है आप एक विशेष चरण के लिए एक प्लगइन लक्ष्य बाध्य है, यह परियोजना की पैकेजिंग के, कि चरण के दौरान ट्रिगर किया जाएगा परवाह किए बिना Default Lifecycle Bindings कुछ भी नहीं है।। इसके साथ करने के लिए, वे केवल डिफ़ॉल्ट जीवन चक्र बाइंडिंग हैं। सभी महत्वपूर्ण बात यह है कि यदि प्लगइन बाध्य है, तो build lifecyle का हिस्सा है।)

जैसा कि आपने बताया है, आप पेरेंट पोम में pluginManagement का उपयोग कर सकते हैं प्लगइन की कॉन्फ़िगरेशन के लिए, लेकिन यदि आप वास्तव में माता-पिता में बच्चों के मॉड्यूल और में प्लगइन लक्ष्य निष्पादित करना चाहते हैं (आपके पास करने के अच्छे कारण हो सकते हैं लेकिन अधिकांश समय में, प्लगइन में pom पैकेजिंग वाले मॉड्यूल पर अधिक प्रभाव नहीं होगा जिसमें कोई सामग्री नहीं है), आपको बच्चों में plugins तत्व में प्लगइन का संदर्भ देना होगा।

अपने उदाहरण पर लागू होती है, माता पिता pom.xml निम्नलिखित विनिर्देशों निर्धारित कर सकते हैं:

<project> 
    <packaging>pom</packaging> 
    ... 
    <modules> 
    <module>child</module> 
    </modules> 
    ... 
    <build> 
    <pluginManagement> 
     <plugins> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-jar-plugin</artifactId> 
      <version>2.2</version> 
      <executions> 
      <execution> 
       <id>my-execution-id</id> 
       <phase>integration-test</phase> 
       <goals> 
       <goal>jar</goal> 
       </goals> 
      </execution> 
      </executions> 
     </plugin> 
     ... 
     </plugins> 
    </pluginManagement> 
    </build> 
    ... 
</project> 

और हर बच्चे को pom.xml में, केवल निम्नलिखित की जरूरत है: के साथ

<project> 
    ... 
    <build> 
    ... 
    <plugins> 
     <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-jar-plugin</artifactId> 
     </plugin> 
    </plugins> 
    ... 
    </build> 
</project> 
+1

पास्कल उत्तर सही है। पैरेंट पीओएम 'प्लगइन प्रबंधन>' अनुभाग में प्लगइन के लिए कॉन्फ़िगरेशन परिभाषित करता है लेकिन उनके निष्पादन को मजबूर नहीं करता है, आपको इन मॉडलों के बाल मॉड्यूल में फैलाने के लिए '' अनुभाग भी रखना होगा। – cetnar

+0

मैंने इसे 'maven-jar-plugin' के साथ आजमाया है, लेकिन यह अभी भी मेरे मूल पीओएम प्रोजेक्ट के लिए .jar बनाता है। मैं प्रश्न में विवरण जोड़ूंगा। –

+0

धन्यवाद, यह मेरे लिए काम किया। –

15

वर्णित समाधान प्लगइन प्रबंधन निश्चित रूप से सही है, लेकिन कुछ मामलों में यह फिट नहीं है।मान लीजिए कि आप प्रति निष्पादन की अपनी सेटिंग्स (कॉन्फ़िगरेशन) के साथ कॉन्फ़िगर किए गए बच्चे मॉड्यूल में कई जार: जार लक्ष्यों को चलाने के लिए चाहते हैं। या सामान्य रूप से, जब आप बाल पोम्स को प्लगइन को स्पष्ट रूप से ट्रिगर करने के लिए मजबूर नहीं करना चाहते हैं।

इस मामले में समाधान है कि मेरे लिए काम किया एक विशिष्ट प्रोफ़ाइल के तहत माता-पिता पोम में फांसी परिभाषित करने के लिए था, और यह कुछ फ़ाइल या संपत्ति के अस्तित्व के लिए जाँच करके उदाहरण के लिए बच्चे poms में केवल सक्रिय है:

<profile> 
    <id>generate-dc</id> 
    <activation> 
     <file> 
      <exists>src/main/assembly/some.xml</exists> 
     </file> 
    </activation> 

तब प्लगइन माता-पिता में निष्पादित नहीं किए जाएंगे, लेकिन यदि उनमें फ़ाइल है, या कुछ संपत्ति सेट है तो सभी बच्चों में निष्पादित किया जाएगा।

+0

यह निश्चित रूप से सुंदर नहीं है, लेकिन यह ऐसा करने का एकमात्र काम है जिसे मैंने ऐसा पाया है। हालांकि, मैं फ़ाइल की बजाय सक्रियण को ट्रिगर करने के लिए $ {project.name} या $ {pom.name} जैसी पर्यावरण संपत्ति का उपयोग करने का सुझाव दूंगा, लेकिन यह निश्चित रूप से मामला मामला है। – Miquel

+0

हा, इस सुझाव ने मुझे मेवेन सेगमेंट में उचित "रचित" मिश्रण के लिए एकमात्र समाधान का नेतृत्व किया। खाली प्रोफ़ाइल चयनकर्ता फाइलें बनाओ। यह भयानक है लेकिन यह बदतर हो सकता है। – Reinderien

+1

सशर्त रूप से प्लगइन निष्पादित करने के लिए महान समाधान, मेरा दिन बचाया! –

8

मुझे बच्चे में कुछ प्लगइन चलाने के लिए एक समान आवश्यकता थी, लेकिन माता-पिता पीओएम नहीं। मैंने माता-पिता पीओएम में <skip>true</skip> बताकर इसे हासिल किया।

माता पिता पोम प्रविष्टि के नीचे है:

<plugin> 
    <groupId>eviware</groupId> 
    <artifactId>maven-soapui-plugin</artifactId> 
    <version>4.0.0</version> 
    <inherited>false</inherited> 
    <dependencies> 
     <dependency> 
      <groupId>junit</groupId> 
      <artifactId>junit</artifactId> 
      <version>4.8.2</version> 
     </dependency> 
    </dependencies> 
    <configuration> 
     <skip>true</skip> 
    </configuration> 
</plugin> 

बच्चे परियोजना पोम प्रविष्टि है

नीचे
<plugins> 
    <plugin> 
     <groupId>eviware</groupId> 
     <artifactId>maven-soapui-plugin</artifactId> 
     <version>4.0.0</version> 
     <configuration> 
      <settingsFile>site-service-web/src/test/soapui/soapui-settings.xml</settingsFile> 
      <projectFile>site-service-web/src/test/soapui/PodifiSite-soapui-project.xml</projectFile> 
      <outputFolder>site-service-web/target/surefire-reports</outputFolder> 
      <junitReport>true</junitReport> 
      <exportwAll>true</exportwAll> 
      <printReport>true</printReport> 
     </configuration> 
    </plugin> 
</plugins> 
+0

चेतावनी उपर्युक्त सेटिंग काम कर सकती है लेकिन जटिल मामलों में जहां अन्य पोम माता-पिता को प्राप्त करते हैं और विशेष रूप से प्लगइन जिसे सत्य छोड़ने के रूप में परिभाषित किया गया था, आपको एक समस्या होगी क्योंकि प्लगइन निष्पादित नहीं होगा, जब तक कि आप इसे परिभाषित नहीं करते या इसे कॉन्फ़िगर नहीं करते । शायद ही कभी इस्तेमाल किए गए प्लगइन के लिए आप किसी भी समस्या चाहते हैं लेकिन मैवेन-संसाधन-प्लगइन जैसे प्लगइन के लिए डिफ़ॉल्ट स्किप सत्य एक समस्या हो सकती है – javapapo

+0

यह मेरे लिए काम करता है। हालांकि प्लगइन को मुझे उपयोग करने की आवश्यकता है - एपसेम्बलर - वास्तव में नहीं छोड़ता है, मैंने शीर्ष स्तर पीओएम में कुछ प्लेसहोल्डर कॉन्फ़िगरेशन डाला है और मेरे बच्चे मॉड्यूल ने एपैस्सेबलर लक्ष्य को सही तरीके से चलाने के लिए शुरू किया है। धन्यवाद! :) –

0

मैं पास्कल से जवाब की कोशिश की लेकिन यह मेरे लिए काम नहीं किया। बच्चे के पोम में संदर्भित प्लगइन्स निष्पादित नहीं हुए, मुझे लगता है क्योंकि उनके पास बिल्ड चरण बाध्यकारी नहीं था। How to override default binding to phase of a Maven plugin

मैं किसी और को इस काम के प्राप्त करने की कोशिश करने के लिए है कि सलाह देते हैं:

यहाँ पोस्ट एक समाधान है कि निष्पादन आईडी के लिए प्लग-इन जुड़ कर काम करता है और चरणों का निर्माण का वर्णन है।

0

मूल परियोजना में प्लगइन अनुभाग के तहत <inherited>false</inherited> का उपयोग करें।

प्लस अधिक जानकारी के लिए this page देखें।

0

यह नीचे कॉन्फ़िगरेशन मेरे लिए काम करता है। माता-पिता और बाल पोम दोनों में प्लगइन जोड़ें।

जनक:

<build> 
    <plugins> 
    <plugin> 
     <artifactId>maven-jar-plugin</artifactId> 
     <inherited>true</inherited> 
     <executions> 
     <execution> 
     <phase>integration-test</phase> 
     <goals> 
      <goal>jar</goal> 
     </goals> 
     </execution> 
     </executions> 
     <configuration> 
     <skip>true</skip> 
     </configuration> 
    </plugin> 
    </plugins> 
</build> 

बाल

<build> 
    <plugins> 
    <plugin> 
     <artifactId>maven-jar-plugin</artifactId> 
     <inherited>false</inherited> 
     <executions> 
     <execution> 
     <phase>integration-test</phase> 
     <goals> 
      <goal>jar</goal> 
     </goals> 
     </execution> 
     </executions> 
     <configuration> 
     <skip>false</skip> 
     </configuration> 
    </plugin> 
    </plugins> 
</build> 
संबंधित मुद्दे