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


98

हमारे पास मावेन 2 परियोजना है जिसमें बहुत सारे मॉड्यूल हैं। उदाहरण:

<modules>
  <module>common</module>
  <module>foo</module>
  <module>data</module>
  <module>bar</module>
  ... more ...
</module>

मान लें कि "डेटा" मॉड्यूल का निर्माण करने में समय लगता है और जब परियोजना सीआई सर्वर द्वारा बनाई जाती है तो हम इसे बाहर करना चाहते हैं। वर्तमान में हम इसे प्राप्त करने के लिए दो pom.xml फ़ाइलों का उपयोग करते हैं। एक में सभी मॉड्यूल होते हैं और दूसरे में सभी मॉड्यूल होते हैं सिवाय इसके कि जिन्हें CI के लिए छोड़ा जा सकता है। लेकिन यह बहुत कष्टप्रद है क्योंकि कभी-कभी हम दोनों फाइलों में एक नया मॉड्यूल डालना भूल जाते हैं ।

क्या कोई समाधान है जिसे दो अलग-अलग मॉड्यूल सूचियों की आवश्यकता नहीं है?

जवाबों:


73

इस profilesतरह का उपयोग करने के लिए सबसे आसान हो सकता है :

<project>
  ...
  <modules>
    <module>common</module>
    <module>foo</module>
    <module>bar</module>
  <modules>
  ...
  <profiles>
    <profile>
      <id>expensive-modules-to-build</id>
      <modules>
        <module>data</module>
      </modules>
    </profile>
  </profiles>
</project>

फिर आपको उन तरीकों की जांच करनी चाहिए, जिनसे आप प्रोफाइल सक्रिय कर सकते हैं


यदि आप सामान्य से पहले होने के लिए डेटा की जरूरत है तो आप क्या करेंगे? इस मामले में प्रोफ़ाइल मॉड्यूल रिएक्टर क्रम में डिफ़ॉल्ट मॉड्यूल के बाद रखा जाएगा। क्या आदेश देने के लिए एक पैटर्न है?
पीटर काह्न

9
मॉड्यूल का क्रम वह क्रम नहीं है जिसमें वे रिएक्टर में दिखाई देंगे। आदेश को प्रभावित करने का एकमात्र तरीका, मॉड्यूल के बीच निर्भरता बनाना है, अर्थात <निर्भरता> टैग का उपयोग करना। आप इसके लिए घोषणा के आदेश पर भरोसा नहीं कर सकते।
SaM

7
@ एसएएम वास्तव में, मावेन 3.0.5 के रूप में रिएक्टर 'मॉड्यूल' में आदेश को ध्यान में रखेगा , हालांकि निर्भरता द्वारा निर्धारित आदेश एक उच्च प्राथमिकता है।
नरकोदयलो

यह कुछ अन्य प्लग-इन को तोड़ देगा जो प्रोफ़ाइल में मॉड्यूल का पता लगाने में विफल रहता है यहां तक ​​कि प्रोफ़ाइल भी सक्षम है
Tribbloid

143

मावेन 3.2.1 के साथ, अब आप -pl !<module_name>,!<module_name>रिएक्टर बिल्ड से कुछ मॉड्यूल को बाहर करने के लिए उपयोग कर सकते हैं ।

इस सुविधा अनुरोध को देखें: https://issues.apache.org/jira/browse/MNG-5230


क्या 3.0.4 से 3.2.1 पर स्विच करना सुरक्षित है या बड़े बदलाव हैं?
जनवरी

मैं बिना किसी मुद्दे के 3.1 से 3.2.1 तक चला गया था। लेकिन ईमानदार होने के लिए, आपको यह पता लगाने के लिए एक निर्माण करना होगा।
योगेश_दिसंबर

30
शेल कमांड लाइन पर विस्मयादिबोधक चिह्न से बचने के लिए मत भूलना। इसका एक बहुत ही विशेष अर्थ है, उदाहरण के लिए देखें unix.stackexchange.com/questions/3747/…
Pavel

5
दुर्भाग्य से वर्तमान में जेनकींस मावेन-प्रोजेक्ट प्लगइन में एक खुला मुद्दा है जो रिएक्टर मॉड्यूल बहिष्करण का समर्थन नहीं करता है: issues.jenkins-ci.org/browse/JENKINS-26472
Nick Vanderhoven

@ फावड़ा: या -इसके बजाय का उपयोग करें !, यानी-pl -<module_name>
msa

45

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

-pl,--projects <arg>                Comma-delimited list of specified
                                    reactor projects to build instead
                                    of all projects. A project can be
                                    specified by [groupId]:artifactId
                                    or by its relative path.

हो सकता है कि इस ध्वज का संयोजन और फिर से इस रखरखाव के बोझ को कम --also-make-dependentsकर --also-makeदे।

-am,--also-make                     If project list is specified, also
                                    build projects required by the
                                    list
-amd,--also-make-dependents         If project list is specified, also
                                    build projects that depend on
                                    projects on the list

इसमें दो अलग-अलग poms का उपयोग करने के समान समस्याएं हैं। हमारे पास ऐसे स्थान हैं जहां हम मॉड्यूल को परिभाषित करते हैं। यही मैं बचने की कोशिश कर रहा हूं।
कयाहर

यह एक अच्छा उपाय है। पोम को अपडेट नहीं करना है। mvn clean install -pl mysubproject
निकोलस- f

22

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

<modules>
    <module>common</module>
    <module>foo</module>
    <module>bar</module>
  </modules>
  ...
  <profiles>
    <profile>
      <id>expensive-modules-to-build</id>
      <activation>
         <activeByDefault>true</activeByDefault>
      </activation>
      <modules>
        <module>data</module>
      </modules>
    </profile>
  </profiles>
</project>

इसके साथ समस्या यह है कि यदि कोई डेवलपर कमांड लाइन पर किसी अन्य प्रोफ़ाइल को निर्दिष्ट करता है, तो expensive-modules-to-buildउसे शामिल नहीं किया जाता है (जब तक कि डेवलपर भी इसे निर्दिष्ट नहीं करता है)। इससे यह याद रखना जटिल हो जाता है कि किन प्रोफाइलों को शामिल करने की आवश्यकता है।

यहाँ एक हैकी तरीका है। दोनों प्रोफाइल हमेशा शामिल हैं, क्योंकि pom.xml फ़ाइल हमेशा मौजूद रहती है। तो महंगे मॉड्यूल को बाहर करने के लिए, आप -P!full-buildकमांड लाइन पर उपयोग कर सकते हैं ।

<profiles>
    <profile>
        <id>full-build</id>
        <activation>
            <file>
                <exists>pom.xml</exists>
            </file>
        </activation>
        <modules>
            <module>data</module>
        </modules>
    </profile>
    <profile>
        <id>short-build</id>
        <activation>
            <file>
                <exists>pom.xml</exists>
            </file>
        </activation>
        <modules>
           <module>common</module>
           <module>foo</module>
           <module>bar</module>
        </modules>
    </profile>
</profiles>

अच्छा उत्तर। लेकिन क्या आपको वास्तव में 2 कोड उदाहरण में दो प्रोफाइल की आवश्यकता है? एक परिवर्तित सक्रियण तत्व कार्य के साथ 1 कोड उदाहरण से एकल प्रोफ़ाइल नहीं होगी?
एरेंड वी। रीनर्सडॉर्फ

@ Arendv.Reinersdorff हाँ यह होगा, हालाँकि यह उत्तर उस निर्माण में अन्य प्रोफाइल के साथ भी काम करता है जिसे आप डिफ़ॉल्ट रूप से शामिल करना चाहते हैं। कुल मिलाकर, मुझे लगता है कि अन्य उत्तर -pl !<module_name>,!<module_name>इस पुराने से बेहतर है
आर्टब्रिस्टल

1
अच्छी सक्रियता छल। इसने मुझे उन समस्याओं को हल कर दिया है <activeByDefault> जो हमेशा सक्रिय नहीं रहती है!
गैब

7

एक अन्य विचार: रिएक्टर मॉड्यूल को घोंसला बनाया जा सकता है, इसलिए अपने तेज और धीमी गति के निर्माण वाले मॉड्यूल को अलग-अलग पॉम में समूहित करना संभव होना चाहिए और फिर इन दोनों में एक और एग्रीगेटर पॉम को मॉड्यूल के रूप में जोड़ना चाहिए। आपका CI सर्वर तब केवल तेज़ बिल्डिंग मॉड्यूल वाले पोम को संदर्भित कर सकता है।

<artifactId>fast</artifactId>
<modules>
    <module>fast-a</module>
    <module>fast-b</module>
    <module>fast-c</module>
</module>

<artifactId>all</artifactId>
<modules>
    <module>fast</module>
    <module>slow</module>
</module>

1

आप मावेन प्रोफाइल का उपयोग कर सकते हैं । हमारे बिल्ड वातावरण में, हमने एक प्रोफ़ाइल बनाई जो quickकई प्लगइन्स और परीक्षण निष्पादन को अक्षम करती है।

इसके द्वारा किया जाता है

    <profile>
        <id>quick</id>
        <properties>
            <skipTests>true</skipTests>
            <!-- others... -->
        </properties>   
        <build>
            <plugins>
                 <!-- configuration... -->
            </plugins>
        </build>
    </profile>

और फिर हम निम्नलिखित तरीके से मावेन का आह्वान करते हैं

mvn groupId:artifactId:goal -P quick

आप इसे संकलित करने के लिए अपने मॉड्यूल के पोम में संकलन और अन्य मानक प्लग इन को अक्षम कर सकते हैं।


2
हां, परीक्षणों को अक्षम करने के लिए यह बहुत अच्छा काम करता है। लेकिन मैं पोम में दो अलग-अलग मॉड्यूल सूचियों के बिना मॉड्यूल को बाहर करने के लिए प्रोफाइल का उपयोग कैसे कर सकता हूं? जहाँ तक मुझे पता है मुझे एक मॉड्यूल अनुभाग में पूर्ण मॉड्यूल सूची और एक अन्य प्रोफ़ाइल अनुभाग में त्वरित-बिल्ड मॉड्यूल सूची डालने की आवश्यकता है। तो यह दो अलग-अलग poms का उपयोग करने के रूप में एक ही समस्या है: मैं बनाए रखने के लिए दो मॉड्यूल सूची है।
कयाहर

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

मावेन के साथ समस्या यह है कि 'जिस तरह से चीजें की जाती हैं' अक्सर 'जिस तरह से वास्तविक दुनिया में किया जाता है' के साथ संरेखण में नहीं है, मावेन अनुभव को खराब और दर्दनाक बनाता है। डेवलपर्स UX प्रशिक्षण की एक खुराक लेने के लिए अच्छा करेंगे।
एड रान्डेल

0

इन लोगों से जो जवाब मांगे जा रहे थे, वैसा बिल्कुल नहीं। मेरी स्थिति यह थी कि मैं केवल माता-पिता को तैनात करना चाहता था। मैं spring-boot-thin-layoutएक बच्चे के मॉड्यूल में उपयोग कर रहा हूँ । इसके लिए मूल मॉड्यूल को आर्टिफैक्ट में तैनात किया जाना आवश्यक है। मैंने अपनी परियोजना में निम्नलिखित को जोड़ा। यह installऔर / या deployचरण को छोड़ देता है।

मेरे माता पिता में:

<properties>
    <disable.install>true</disable.install>
    <disable.deploy>true</disable.deploy>
    <enable.deployAtEnd>true</enable.deployAtEnd>
</properties>

<profiles>
    <profile>
        <id>deploy-parent</id>
        <activation>
            <activeByDefault>true</activeByDefault>
        </activation>
        <properties>
            <disable.install>true</disable.install>
            <disable.deploy>true</disable.deploy>
            <deployAtEnd>${enable.deployAtEnd}</deployAtEnd>
        </properties>
        <build>
            <finalName>${project.version}</finalName>
        </build>
    </profile>
</profiles>

और मेरे बच्चे में पोम या कोई भी मॉड्यूल जिसे आप माता-पिता के साथ तैनात नहीं करना चाहते हैं:

<properties>
    <maven.install.skip>${disable.install}</maven.install.skip>
    <maven.deploy.skip>${disable.deploy}</maven.deploy.skip>
    <deployAtEnd>${enable.deployAtEnd}</deployAtEnd>
</properties>

इतनी प्रभावी रूप से जब मैं mvn deployमूल पोम पर चलता हूं , तो यह सभी मॉड्यूलों को संकलित करेगा, किसी भी चीज पर इंस्टॉल नहीं चलाना, और फिर अंत में किसी भी मॉड्यूल को तैनात नहीं करना चाहिए जिसमें <maven.deploy.skip>${disable.deploy}</maven.deploy.skip>यह गुण न हों। तो मेरे मामले में केवल माता-पिता को तैनात करना।

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