2011-10-17 12 views
36

मेरे पास एक मैवेन मल्टी-मॉड्यूल प्रोजेक्ट है (लड़का, मैंने लिखा है कि रास्ता इस साइट पर कई बार खुलता है)। लगभग सभी मॉड्यूल (यानी, जिनके पास कोड हैं) कोड कवरेज आदि के बारे में रिपोर्ट जेनरेट करने के लिए मेवेन-साइट-प्लगइन चलाएं। इन्हें एक विस्तृत साझा कॉन्फ़िगरेशन है - जो रिपोर्ट करने के लिए रिपोर्ट करता है, कौन सी फाइलें कुछ प्लगइन्स, आदि को कवर/बहिष्कृत करने के लिएएक मेवेन मल्टी-मॉड्यूल प्रोजेक्ट में, मैं एक बच्चे में प्लगइन कैसे अक्षम कर सकता हूं?

हालांकि, कुछ मॉड्यूल हैं जो पैकेजिंग से निपटते हैं - एक टैरबॉल उत्पन्न करने के लिए असेंबली प्लगइन चलाते हैं। इन्हें साइट रिपोर्ट चलाने से कुछ भी नहीं मिलता है - कोई नहीं है विश्लेषण करने के लिए कोड, रिपोर्ट करने के लिए कोई परीक्षण नहीं।

तो मैं मॉड्यूल शेयर प्लगइन विन्यास की जरूरत है कि, और कुछ मॉड्यूल की जरूरत है कि प्लगइन नहीं चल का एक बहुत, अधिमानतः सब पर है। यदि मैं मूल पीओएम के <build> अनुभाग में प्लगइन डालता हूं, तो मैं पूर्व (शेयर कॉन्फ़िगरेशन) कर सकता हूं, लेकिन जब मुझे इस मामले में आवश्यकता हो तो मैं प्लगइन को बंद नहीं कर सकता। मैं बाद में कर सकता हूं (प्लगइन चलाने से बचें) यदि मैं प्रत्येक मॉड्यूल के अपने पीओएम में कॉन्फ़िगरेशन को दबाता हूं, लेकिन मैं इस मामले में कॉन्फ़िगरेशन जानकारी साझा करने का एक अच्छा तरीका नहीं समझ सकता।

क्या मैं चाहता हूं कि एक प्लगइन के लिए साझा कॉन्फ़िगरेशन, जिसे कभी-कभी किसी बच्चे मॉड्यूल द्वारा अक्षम किया जाता है - यहां तक ​​कि संभव है? यदि हां, तो कैसे?

उत्तर

61

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

<plugin> 
    <groupId>org.codehaus.mojo</groupId> 
    <artifactId>exec-maven-plugin</artifactId> 
    <version>1.2.1</version> 
    <executions> 
     <execution> 
      <id>i-do-something</id> 
      <phase>initialize</phase> 
      <goals> 
       <goal>exec</goal> 
      </goals> 
      <configuration> 
       ... lots of configuration 
      </configuration> 
     </execution> 
    </executions> 
</plugin> 
फिर एक बच्चे मॉड्यूल में

, तो आप ऐसा कर सकते हैं: क्योंकि यह एक ही प्लगइन और एक ही निष्पादन आईडी है

<plugin> 
    <groupId>org.codehaus.mojo</groupId> 
    <artifactId>exec-maven-plugin</artifactId> 
    <version>1.2.1</version> 
    <executions> 
     <execution> 
      <id>i-do-something</id> 
      <phase/> 
     </execution> 
    </executions> 
</plugin> 

, यह विन्यास ओवरराइड करता है माता-पिता में निर्दिष्ट, और अब प्लगइन बाल परियोजना में एक चरण से बंधे नहीं है।

+1

बहुत बढ़िया, मुझे पता था कि यह ऐसा कुछ होगा, लेकिन मैं अभी भी एक पीले-बेल्ट की तरह हूं (यदि आपने हाल के इतिहास में मेवेन सवालों के निशान से अनुमान नहीं लगाया था)। मैं परियोजनाओं को [इस] (http://stackoverflow.com/questions/7589931/how-should-i-share-maven-depdendencymanagement-from-multiple- स्रोतों) के कारण अलग-अलग माता-पिता में नहीं ले जा सकता, लेकिन मैं करूँगा रिपोर्ट प्लगइन को अनबाइंड करें। धन्यवाद! – Coderer

+4

पेरेंट मॉड्यूल में प्लगइन के लिए निर्दिष्ट '' नहीं है, तो यह दृष्टिकोण काम नहीं करता है। – EvgeniySharapov

+5

@evgeniysharapov आप अभी भी उस मामले में बाल मॉड्यूल में ' कोई भी' का उपयोग कर सकते हैं, [यह उत्तर] देखें (http://stackoverflow.com/a/14653088/1155724)। –

1

रायन स्टीवर्ट का उत्तर काम करता है अगर आप पैरेंट पोम में दबाने की इच्छा रखते हैं तो id के साथ टैग किया जाता है। यदि, हालांकि, पैरेंट पोम निष्पादन को id (और, ज़ाहिर है, आप उस पैरेंट पोम को संपादित नहीं कर सकते) के साथ टैग नहीं करते हैं, तो मैंने पाया कि निम्नलिखित करने से माता-पिता पोम की कार्रवाई को दबा दिया जाता है।

  1. पहले सेट none
  2. के निष्पादन के चरण एक और निष्पादन बनाएं, यह एक id देने के लिए और यह में क्या आप इसे क्या करने की जरूरत।
  3. रन mvn help:effective-pom यह पुष्टि करने के लिए कि यह सही ढंग से दबाया गया है जिसे आपको पैरेंट पोम से दबाया गया था।

यहाँ एक उदाहरण है:

<plugin> 
     <artifactId>maven-source-plugin</artifactId> 
     <version>2.1.2</version> 
     <executions> 
     <execution> 
      <phase>package</phase> 
      <goals> 
      <goal>jar</goal> 
      </goals> 
     </execution> 
     </executions> 
     <inherited>true</inherited> 
    </plugin> 

मैं jar-no-fork के लक्ष्य को बदलने के लिए की जरूरत: यह कैसे मेरे माता पिता पोम की तरह दिखाई देता है।ध्यान दें कि पैरेंट पोम में निष्पादन में id नहीं है जिसे मैं इसे अक्षम करने के लिए उपयोग कर सकता हूं।

 <plugin> 
     <artifactId>maven-source-plugin</artifactId> 
     <version>2.2.1</version> 
     <executions> 
      <execution> 
      <phase>none</phase> 
      <goals> 
       <goal>jar</goal> 
      </goals> 
      <configuration> 
       <archive> 
       <compress>false</compress> 
       </archive> 
      </configuration> 
      </execution> 
      <execution> 
      <id>attach-sources</id> 
      <goals> 
       <goal>jar-no-fork</goal> 
      </goals> 
      <configuration> 
       <archive> 
       <compress>false</compress> 
       </archive> 
      </configuration> 
      </execution> 
     </executions> 
     <inherited>true</inherited> 
     <configuration> 
      <archive> 
      <compress>false</compress> 
      </archive> 
     </configuration> 
     </plugin> 

यह सुनिश्चित किया कि लक्ष्य jar कभी नहीं चलाता है और केवल लक्ष्य jar-no-fork कार्यान्वित:

  <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-source-plugin</artifactId> 
       <executions> 
        <execution> 
         <phase>none</phase> 
        </execution> 
        <execution> 
         <id>attach-sources</id> 
         <goals> 
          <goal>jar-no-fork</goal> 
         </goals> 
        </execution> 
       </executions> 
      </plugin> 

एक परिणाम यह कैसे प्रभावी-पोम लगता है कि है: तो यहाँ क्या मेरे बच्चे पोम को जोड़ा गया है - जो मैं प्राप्त करना चाहता था।

संबंधित मुद्दे