2010-08-11 16 views
26

के उप-मॉड्यूल में कमांड लाइन से एक विशिष्ट मेवेन प्लगइन लक्ष्य चला रहा है, मैं यहां एक सामान्य तकनीक की तलाश में हूं, लेकिन चलिए एक विशिष्ट उदाहरण दें। मेरे पास एक बहु-मॉड्यूल प्रोजेक्ट है और मैं अपने प्रोजेक्ट के उप-मॉड्यूल में से एक के खिलाफ कमांड लाइन से exec:java लक्ष्य को चलाने के लिए चाहता हूं।मल्टी-मॉड्यूल रिएक्टर प्रोजेक्ट

मुझे पता है कि एक दृष्टिकोण यह है कि मैं पूरी परियोजना पर mvn install चला सकता हूं और फिर उप-मॉड्यूल निर्देशिका में जा सकता हूं, कमांड लाइन से exec:java कमांड चला सकता हूं, और मेरे स्थानीय भंडार में कलाकृतियों का समाधान हो सकता है। लेकिन mvn install चल रहा है हर समय बहुत थकाऊ हो जाता है।

मैवेन रिएक्टर के खिलाफ exec:java चलाने के लिए मुझे वास्तव में क्या पसंद है, जहां क्लासपाथ मेवेन रिएक्टर में प्रोजेक्ट के सक्रिय मॉड्यूल से बनाया गया है। समस्या यह है कि मुझे यकीन नहीं है कि यह संभव है। प्रोजेक्ट की जड़ से exec:java लक्ष्य को चलाने का एक बेवकूफ तरीका है, लेकिन यह प्रोजेक्ट में प्रत्येक मॉड्यूल के खिलाफ प्लगइन चलाने की कोशिश करता है, जैसा कि मुझे रुचि रखने वाले लक्षित मॉड्यूल के विपरीत है।

कोई विचार? मुझे पता है कि मेरा प्रेरक उदाहरण exec:java था, लेकिन वास्तव में कई एकल प्लगइन लक्ष्यों हैं जो मैं अपने प्रोजेक्ट के खिलाफ समय-समय पर पूर्ण निर्माण जीवन चक्र के दायरे से बाहर चलना चाहता हूं।

उत्तर

26

मेरे पास एक बहु-मॉड्यूल प्रोजेक्ट है और मैं अपने प्रोजेक्ट के उप-मॉड्यूल में से एक के विरुद्ध कमांड लाइन से exec:java प्लगइन चलाने के लिए चाहता हूं।

मैं यह नहीं कह रहा हूँ कि यह अपने सटीक उपयोग के मामले फिट होगा, लेकिन यह एक बहु मॉड्यूल के एक उपसमूह पर एक लक्ष्य को चलाने के लिए संभव है -pl, --projects <arg> विकल्प का उपयोग बिल्ड:

mvn exec:java -pl my-module 

मुझे पता है कि एक दृष्टिकोण यह है कि मैं पूरी परियोजना पर "एमवीएन इंस्टॉल" चला सकता हूं और फिर उप-मॉड्यूल निर्देशिका में जा सकता हूं, कमांड लाइन से exec: java कमांड चला सकता हूं, और मेरे स्थानीय भंडार में कलाकृतियों का हल हो सकता है।

निर्भरता संकल्प वास्तव में स्थानीय भंडार के माध्यम से किया जाता है।

मैं क्या वास्तव में चाहते हैं Maven रिएक्टर, जहां classpath Maven रिएक्टर में परियोजना के सक्रिय मॉड्यूल से निर्माण किया है के खिलाफ exec:java चलाने की क्षमता है।

यह वास्तव में एक रिएक्टर बिल्ड नहीं करता है। एक रिएक्टर बिल्ड मॉड्यूल के उन्मुख ग्राफ को बनाता है, इस ग्राफ से उचित निर्माण आदेश प्राप्त करता है और गणना/क्रम में मॉड्यूल के खिलाफ लक्ष्य/चरण चलाता है। एक रिएक्टर बिल्ड कुछ "ग्लोबल" क्लासपाथ का निर्माण नहीं करता है।

एक अनुभवहीन दृष्टिकोण परियोजना की जड़ से exec:java लक्ष्य को चलाने के लिए है, लेकिन इस के रूप में लक्ष्य मॉड्यूल मैं में दिलचस्पी रखता हूँ करने के लिए विरोध परियोजना में हर मॉड्यूल के खिलाफ प्लग इन चलाने की कोशिश करता है,।

अच्छा, यह अपेक्षित व्यवहार है। ऐसा लगता है कि आप वास्तव में क्या खोज रहे हैं।

कोई विचार?मैं जानता हूँ कि मेरी प्रेरित उदाहरण था कार्यकारी: जावा, लेकिन वास्तव में वहाँ एक प्लगइन लक्ष्यों है कि मैं पूर्ण निर्माण जीवन चक्र

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

4

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

<profiles>                              
    <profile>                              
    <id>test-java</id>                           
    <build>                              
     <plugins>                             
     <plugin>                             
      <groupId>org.codehaus.mojo</groupId>                     
      <artifactId>exec-maven-plugin</artifactId>                    
      <version>1.1.1</version>                        
      <executions>                           
      <execution>                           
       <phase>test</phase>                        
       <goals>                           
       <goal>java</goal>                        
       </goals>                           
       <configuration>                         
       <mainClass>com.foo.bar.MyClass</mainClass>                  
       </configuration>                         
      </execution>                           
      </executions>                           
     </plugin>                            
     </plugins>                             
    </build>                              
    </profile>                              
</profiles>                              
अपनी परियोजना के ऊपर से

फिर, चलाएँ:

mvn test -Ptest-java 

यह हमेशा की तरह आपस में मॉड्यूल classpath स्थापित करेगा, और सभी में परीक्षण जावा प्रोफ़ाइल को चलाने के लिए प्रयास अपने subprojects के। लेकिन चूंकि केवल जिसकी आप परवाह है, वह प्रोफाइल परिभाषित है, यह केवल एक ही है जो कुछ भी करेगा।

मैवेन के लिए आपके अन्य उपप्रोजेक्ट्स नूपिंग के माध्यम से पीसने के लिए अतिरिक्त समय लगता है, लेकिन यह इतना बुरा नहीं है।

ध्यान देने योग्य एक बात यह है कि उपप्रोजेक्ट शीर्ष-स्तर निर्देशिका के साथ वर्तमान कार्यशील निर्देशिका (उपप्रोजेक्ट निर्देशिका नहीं) के रूप में चलाया जाता है। इसके आसपास काम करने के लिए आप इतना कुछ नहीं कर सकते हैं, लेकिन उम्मीद है कि इससे आपको परेशानी नहीं होगी।

1

पास्कल का सुझाव संभवतः आप चाहते हैं। ध्यान दें कि वर्तमान में निर्भरताओं को संकलित करना संभव नहीं है, फिर एप, एक मेवेन कमांड में इत्यादि चलाएं: https://jira.codehaus.org/browse/MNG-5059

8

एक और तरीका है जो आपको प्लगइन निष्पादित करने के लिए एकाधिक मॉड्यूल चुनने देता है।

कई प्लगइन्स में skip विकल्प है, जिसे आप रूट प्रोजेक्ट पर true पर सेट करके सक्रिय कर सकते हैं। प्लगइन निष्पादन तब सभी उप-मॉड्यूल के लिए डिफ़ॉल्ट रूप से छोड़ा जाएगा। प्लग-इन निष्पादित करने वाले उप-मॉड्यूल स्पष्ट रूप से skip से false पर सेट कर सकते हैं। आपको अभी भी रूट प्रोजेक्ट में किसी गैर-वैकल्पिक विशेषताओं को कॉन्फ़िगर करने की आवश्यकता है। exec:exec लक्ष्य के लिए विन्यास के साथ exec-maven-plugin की

उदाहरण:

<!-- root project --> 
<build> 
    <pluginManagement> 
     <plugins> 
      <plugin> 
       <groupId>org.codehaus.mojo</groupId> 
       <artifactId>exec-maven-plugin</artifactId> 
       <version>1.3.2</version> 
       <configuration> 
        <skip>true</skip> 
        <executable>java</executable> 
       </configuration> 
      </plugin> 
     </plugins> 
    </pluginManagement> 
</build> 
<!-- any module that should execute the plugin --> 
<build> 
    <plugins> 
     <plugin> 
      <groupId>org.codehaus.mojo</groupId> 
      <artifactId>exec-maven-plugin</artifactId> 
      <configuration> 
       <skip>false</skip> 
       <!-- ... --> 
      </configuration> 
     </plugin> 
    </plugins> 
</build> 
+2

यह पहली और एकमात्र जवाब है कि वास्तव में बदसूरत हैक्स का सहारा के बिना मेरे लिए काम किया है। यदि आप exec: java का उपयोग करते हैं, तो माता-पिता 'pom.xml' में' 'टैग हटाएं और त्रुटि संदेश को दबाने के लिए ' कोई भी' जोड़ें। – Jodiug

+2

मेरी इच्छा है कि यह उत्तर अधिक प्रमुख था। यह कम से कम 'हैकी' तरीका है और वास्तव में काम करता है। – Alexandros

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