एक मावेन बिल्ड के दौरान एक सबमॉड्यूल छोड़ें


160

हमें कुछ विशेष वातावरणों में एक सबमॉड्यूल को छोड़ने में सक्षम होने की आवश्यकता है।

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

क्या प्रोफ़ाइल सेटिंग के साथ ऐसा करने का कोई तरीका है? मैंने कुछ काम किया है और अन्य प्रश्नों / उत्तरों को यहाँ देखा है और एक अच्छा समाधान नहीं मिला है।

मुझे लगता है कि एक विकल्प यह है कि माता-पिता से उस सबमॉडल को pom.xmlपूरी तरह से हटा दें , और उस मॉड्यूल को बनाने के लिए हमारे CI सर्वर पर एक और प्रोजेक्ट जोड़ें।

सुझाव?


मावेन वे क्यों नहीं? यह मेरे लिए पूरी तरह से वैध दावा है।
MaDa

हम्म। अब मैं उन जगहों का पता नहीं लगा सकता जहाँ लोग इसके खिलाफ बहस कर रहे थे ... इसलिए मैंने अपना दावा हटाने के लिए अपने मूल प्रश्न को अपडेट कर दिया है कि यह "द मेवेन वे" नहीं लगता।
डेनिशास्किन

जवाबों:


149

यकीन है, यह प्रोफाइल का उपयोग करके किया जा सकता है। आप अपने माता-पिता pom.xml में निम्न की तरह कुछ कर सकते हैं।

  ...
   <modules>
      <module>module1</module>
      <module>module2</module>  
      ...
  </modules>
  ...
  <profiles>
     <profile>
       <id>ci</id>
          <modules>
            <module>module1</module>
            <module>module2</module>
            ...
            <module>module-integration-test</module>
          </modules> 
      </profile>
  </profiles>
 ...

आपके CI में, आप ciप्रोफ़ाइल के साथ मावेन चलाएंगे , अर्थातmvn -P ci clean install


4
बहुत बढ़िया जवाब! मुझे नहीं पता कि मुझे मावेन डॉक्स से इसे खोजने में इतनी परेशानी क्यों हुई। एक सुझाव जो मैं बनाऊंगा वह यह है कि क्योंकि मैं डिफ़ॉल्ट रूप से चलाने के लिए एकीकरण परीक्षण पसंद करता हूं, मैंने activeByDefaultउस प्रोफ़ाइल में जोड़ा , और फिर skip-integration-testsउन्हें छोड़ने में सक्षम होने के लिए एक और खाली प्रोफ़ाइल (जैसे ) जोड़ना पड़ा ।
डेनिशास्किन

7
सभी साझा किए गए सामानों की नकल किए बिना ऐसा करने का कोई तरीका है?
जोनिरा

7
सावधान, यदि आप मावेन-रिलीज़-प्लगइन का उपयोग करते हैं, तो ऐसा प्रतीत होता है कि यह सबमोड्यूल्स के संस्करण संख्या को अपडेट नहीं करता है जो एक प्रोफ़ाइल स्विच के पीछे छिपे हुए हैं। आप अपनी परियोजना के बाकी हिस्सों में अलग-अलग संस्करण संख्याओं के साथ उप-मॉड्यूल रख सकते हैं ...
अर्डेसको

8
दुर्भाग्यवश, उस प्रोफाइल को खोलना जिसे आप पहले किसी मॉड्यूल <pom के मुख्य भाग में उल्लिखित मॉड्यूल से बाहर नहीं कर सकते। JIRA के मुद्दे .apache.org/jira/browse/MNG-5230 (और पूरे पोम संरचना) को थोड़ा और अधिक सावधानीपूर्वक विचार के साथ पूरी तरह से लागू किया जा सकता था।
एड रान्डेल

2
क्या यह समाधान वास्तव में काम करता है? कम से कम मुझे यह काम करने के लिए नहीं मिल सकता है। मुझे लगता है कि मेरे पास @EdRandall
Gerros

231

मावेन संस्करण 3.2.1 ने इस सुविधा को जोड़ा, आप कुछ उप-वर्गो को बाहर करने के लिए या ( स्रोत ) के साथ -plस्विच ( सूची के लिए शॉर्टकट--projects ) का उपयोग कर सकते हैं ।!-

mvn -pl '!submodule-to-exclude' install
mvn -pl -submodule-to-exclude install

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

कई मॉड्यूल को बाहर करने का सिंटैक्स समावेशन के समान है

mvn -pl '!submodule1,!submodule2' install
mvn -pl -submodule1,-submodule2 install

EDIT विंडोज सिंगल कोट्स को पसंद नहीं करता है, लेकिन यह बैश में आवश्यक है; विंडोज में, दोहरे उद्धरण चिह्नों का उपयोग करें (धन्यवाद @awilkinson)

mvn -pl "!submodule1,!submodule2" install

27
महत्वपूर्ण: यदि आप एक नेस्टेड सबमॉड्यूल को बाहर करना चाहते हैं तो आपको योग्य संस्करण का उपयोग करने की आवश्यकता हैmvn -pl !com.acme:nestedmodule1
लियोनार्ड ब्रूडिंग

3
-Pl विकल्प की जरूरत है '[groupId]:' विरूपण साक्ष्य से पहले ', इसलिए हमें mvan -pl का उपयोग करना चाहिए': 'सबमॉड्यूल-टू-आउट' इंस्टॉल करें
Honsen

4
आप भी उपयोग कर सकते हैं mvn -pl '!path/to/submodule/directory', बिना groupId और कलाकृतियों का उपयोग किए। मेरा जवाब काम करता है submodule1और submodule2वर्तमान निर्देशिका में स्थित हैं।
अलेक्जेंड्रे ड्यूब्रिल

यह भी लायक कुछ भी नहीं है कि अगर आप का उपयोग करें -plमें mvn install, आप की संभावना के लिए उपयोग करने की आवश्यकता होगी mvn deployके रूप में अच्छी तरह से
majikman

39

-plकमांड लाइन तर्क को निर्दिष्ट करके यह तय करना संभव है कि कौन से रिएक्टर प्रोजेक्ट बनाए जाएं :

$ mvn --help
[...]
 -pl,--projects <arg>                   Build specified reactor projects
                                        instead of all projects
[...]

यह निम्नलिखित रूपों में से एक में अल्पविराम द्वारा अलग किए गए मापदंडों की सूची को स्वीकार करता है:

  • POM वाले फ़ोल्डर का सापेक्ष पथ
  • [groupId]:artifactId

इस प्रकार, निम्नलिखित संरचना को देखते हुए:

project-root [com.mycorp:parent]
  |
  + --- server [com.mycorp:server]
  |       |
  |       + --- orm [com.mycorp.server:orm]
  |
  + --- client [com.mycorp:client]

आप निम्न कमांड लाइन निर्दिष्ट कर सकते हैं:

mvn -pl .,server,:client,com.mycorp.server:orm clean install

सब कुछ बनाने के लिए। सूची में तत्वों को केवल आपके द्वारा बनाए जाने वाले मॉड्यूल के निर्माण के लिए निकालें।


संपादित करें: जैसा कि ब्लैकवेल ने बताया, मावेन 3.2.1 के रूप में आपके पास एक नया -elझंडा है जो रिएक्टर से परियोजनाओं को बाहर -plकरता है , उसी तरह जो करता है:


2
धन्यवाद। इसने मेरे लिए अच्छा काम किया। यह भी ध्यान दें कि आप "-म" (AKA "- अलसो-मेक") को भी जोड़ सकते हैं ताकि उन परियोजनाओं का निर्माण कर सकें जो आपके द्वारा निर्दिष्ट मॉड्यूल द्वारा आवश्यक हैं।
GaZ

1
महान! मैंने mvn install -pl .बिना बिल्डिंग मॉड्यूल के केवल स्थानीय रेपो में पैरेंट पोम स्थापित करने के लिए उपयोग किया ।
मार्सिन

इसके अलावा, jira.codehaus.org/browse/MNG-5230 पर एक नज़र डालें । अब आप रिएक्टर से परियोजनाओं को बाहर कर सकते हैं।
कालाधन

1
MNG-5230 लिंक के बाद से codehaus.org बंद: issues.apache.org/jira/browse/MNG-5230
Ed Randall

दुर्भाग्य से, यह सकर्मक रूप से काम नहीं करता है, अर्थात, अगर मेरे पास शीर्ष / mod1 / mod2 है, और ऊपर से निर्माण, -pl '! Mod2' एक त्रुटि उठाता है।
zakmck

4

मल्टी-मॉड्यूल परियोजनाओं की धारणा एक परियोजना के कोडपेंडेंट सेगमेंट की जरूरतों को पूरा करने के लिए है। ऐसा ग्राहक सेवाओं पर निर्भर करता है जो बदले में ईजेबी या डेटा-एक्सेस रूटीन पर निर्भर करता है। आप अपने निरंतर एकीकरण (CI) परीक्षणों को इस तरीके से समूहित कर सकते हैं । मैं तर्क देता हूं कि यह कहकर कि सीआई परीक्षणों को एप्लिकेशन लॉजिक परिवर्तनों के साथ लॉक-स्टेप में होना चाहिए।

मान लीजिए कि आपकी परियोजना इस प्रकार है:

project-root
  |
  + --- ci
  |
  + --- client
  |
  + --- server

project-root/pom.xmlपरिभाषित करता है मॉड्यूल

<modules>
  <module>ci</module>
  <module>client</module>
  <module>server</module>
</modules>

ci/pom.xmlपरिभाषित करता है प्रोफाइल जैसे:

... 
<profiles>
  <profile>
    <id>default</id>
    <activation>
      <activeByDefault>true</activeByDefault>
    </activation>
    <plugin>
       <artifactId>maven-surefire-plugin</artifactId>
       <configuration>
         <skip>true</skip>
       </configuration>
     </plugin>
  </profile>
  <profile>
    <id>CI</id>
    <plugin>
       <artifactId>maven-surefire-plugin</artifactId>
       <configuration>
         <skip>false</skip>
       </configuration>
     </plugin>
  </profile>
</profiles>

इस मॉड्यूल में Maven स्किपिंग टेस्ट के परिणामस्वरुप जब प्रोफ़ाइल नाम CIसक्रिय होगा तब को छोड़कर । आपके CI सर्वर को निष्पादित करने का निर्देश दिया जाना चाहिए mvn clean package -P CI। मावेन वेब साइट की रूपरेखा तंत्र की गहन व्याख्या है


2

अब (1.1.1 संस्करण से) गड्ढे में एक 'स्किप' ध्वज है।

तो आप इस तरह की चीजें कर सकते हैं:

    <profile>
        <id>pit</id>
        <build>
            <plugins>
                <plugin>
                    <groupId>org.pitest</groupId>
                    <artifactId>pitest-maven</artifactId>
                    <configuration>
                        <skip>true</skip>
                    </configuration>
                </plugin>
            </plugins>
        </build>
    </profile>

आपके मॉड्यूल में, और गड्ढे छोड़ देंगे

[जानकारी] --- पिटस्ट-मावेन: १.१.३: उत्परिवर्तन

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.