मावेन मॉड्यूल + एक विशिष्ट मॉड्यूल का निर्माण


383

मैं एक माता पिता परियोजना के साथ एक बहु मॉड्यूल Maven परियोजना है Pऔर तीन उप-मॉड्यूल A, Bऔर C। दोनों Bऔर Cयुद्ध परियोजनाओं कर रहे हैं और दोनों पर निर्भर करते हैं A

मैं टाइप कर सकते हैं mvn compileमें Pऔर उप मॉड्यूल सही तरीके से संकलित के सभी है। समस्या तब आती है जब मैं विशिष्ट मॉड्यूल के लिए ऑपरेशन करना चाहता हूं।

मैं परियोजना के लिए एक युद्ध को पैकेज करने में सक्षम होना चाहता हूं B, लेकिन जब मैं पैकेज कमांड को Bनिर्देशिका से चलाता हूं , तो यह शिकायत करता है कि यह निर्भरता नहीं ढूंढ सकता है A

मैं इस सवाल से समझता हूं: मावेन और आश्रित मॉड्यूल जो शायद मावेन वास्तव में इस प्रकार के निर्भरता रिज़ॉल्यूशन के लिए डिज़ाइन नहीं किए गए हैं, लेकिन यह इस सवाल का जवाब देता है कि मैं कैसे पैकेज Bकरूं?

  1. क्या मुझे mvn packageपूरे प्रोजेक्ट पदानुक्रम के लिए दौड़ना होगा जब मैं वास्तव में सिर्फ चाहता हूं B?

  2. क्या मुझे अपने स्थानीय रिपॉजिटरी में A का स्नैपशॉट स्थापित करना है जो मुझे हर बार पैकेज करना है B?

Aसक्रिय विकास के दौरान अभी भी यह दूसरा परिदृश्य ज्यादा मजेदार नहीं है।

किसी भी सर्वोत्तम प्रथाओं यहाँ?


जवाबों:


694

किसी भी सर्वोत्तम प्रथाओं यहाँ?

मावेन उन्नत रिएक्टर विकल्पों का उपयोग करें , विशेष रूप से:

-pl, --projects
        Build specified reactor projects instead of all projects
-am, --also-make
        If project list is specified, also build projects required by the list

तो बस cdमूल पी निर्देशिका में और चलाने:

mvn install -pl B -am

और यह बी और बी द्वारा आवश्यक मॉड्यूल का निर्माण करेगा।

ध्यान दें कि यदि आप artifactIdनिर्देशिका नाम से अलग कोई संदर्भ दे रहे हैं, तो आपको एक कोलन का उपयोग करने की आवश्यकता है :

mvn install -pl :B -am

जैसा कि यहाँ बताया गया है: https://stackoverflow.com/a/26439938/480894


15
2011 में इस पेज को हिट करने के लिए, यह बेहतर उत्तर है। मावेन में ही मल्टी-मॉड्यूल के लिए अब बेहतर समर्थन है (मावेन 2.1 और इसके बाद के संस्करण), आपको रिएक्टर प्लगइन का उपयोग करने की आवश्यकता नहीं है।
Spedge

17
एक और बहुत उपयोगी विकल्प "-एमडी, - अलसो-मेक-आश्रित" है, जो रिएक्टर सूची में परियोजनाओं पर निर्भर सभी मॉड्यूल बनाता है।
deterb

1
पोते के मॉड्यूल के निर्माण के बारे में क्या?
बैक्स

12
@ बैक्स, mvn install -pl .,parent/child,parent/child/grandchild कई प्रोजेक्ट्स को अलग करने के लिए कॉमा का उपयोग करें और। पैरेंट पोम के लिए
नियो

1
जब मैं clean packageइस तरह से एक मॉड्यूल की कोशिश करता हूं , तो यह रिएक्टर निर्भरता को हल नहीं कर सकता है जो अभी तक स्थापित नहीं हैं। इसके साथ -amअनावश्यक रूप से डिपुओं का पुनर्निर्माण होगा।
बेसिन

18

मान लें कि pom.xml में 6 मॉड्यूल हैं और आप A , B और F चलाना चाहते हैं ।

<modules>
        <module>A</module>
        <module>B</module>
        <module>C</module>
        <module>D</module>
        <module>E</module>
        <module>F</module>
  </modules>

1- मूल परियोजना में सीडी

 mvn --projects A,B,F --also-make clean install

या

mvn -pl A,B,F -am clean install

या

mvn -pl A,B,F -amd clean install

नोट: जब आप -am विकल्प के साथ एक परियोजना निर्दिष्ट करते हैं , तो मावेन उन सभी परियोजनाओं का निर्माण करेगा जो निर्दिष्ट परियोजना (या तो प्रत्यक्ष या अप्रत्यक्ष रूप से) पर निर्भर करती है। मावेन परियोजनाओं की सूची की जांच करेगा और उन सभी परियोजनाओं को खोजेगा जो इसे बनाने की जरूरत है।

जबकि -am कमांड मल्टी-मॉड्यूल बिल्ड में किसी विशेष प्रोजेक्ट के लिए आवश्यक सभी परियोजनाओं को बनाता है, -amd या --also-make-dependents विकल्प एक प्रोजेक्ट बनाने के लिए Maven को कॉन्फ़िगर करता है और कोई भी प्रोजेक्ट जो उस प्रोजेक्ट पर निर्भर करता है। - अलसो-मेकअप-आश्रितों का उपयोग करते समय , मावेन हमारे रिएक्टर में उन सभी परियोजनाओं की जांच करेगा, जो किसी विशेष परियोजना पर निर्भर परियोजनाओं को खोजने के लिए करते हैं। यह स्वचालित रूप से उन परियोजनाओं का निर्माण करेगा और कुछ नहीं।


8

मावेन बिल्कुल इस प्रकार की निर्भरता के लिए डिज़ाइन किया गया था।

mvn package आपके स्थानीय रिपॉजिटरी में कुछ भी स्थापित नहीं होगा यह सिर्फ परियोजना को पैकेज करता है और इसे लक्ष्य फ़ोल्डर में छोड़ देता है।

क्या mvn install, माता पिता परियोजना (ए) में साथ इस सभी उप मॉड्यूल, आपके कंप्यूटर की Maven भंडार में स्थापित किया जाएगा अगर वहाँ कोई बदलाव नहीं तुम सिर्फ संकलन / उप मॉड्यूल पैकेज (बी) और Maven पहले से ही पैक ले जाएगा करने की जरूरत है और स्थापित निर्भरताएं सही हैं।

mvn installयदि आपको कोड के कुछ हिस्से को अपडेट करना है, तो आपको बस मूल परियोजना में जरूरत होगी ।


3
यह विकास के दौरान एक बुरा सपना होगा, छवि है कि एक बार जब आप उप मॉड्यूल में एक तय करते हैं, तो आप इसे स्थापित करेंगे, और फिर आप सर्वलेट कंटेनर शुरू करेंगे। जीवन छोटा है :(
hguser

7

यदि आपने पहले प्रोजेक्ट B पर mvn इंस्टॉल चलाया है, तो यह आपके स्थानीय रिपॉजिटरी में इंस्टॉल हो जाएगा, इसलिए जब आप पैकेज बनाते हैं तो ए मावेन निर्भरता को हल कर सकता है। इसलिए जब तक आप हर बार प्रोजेक्ट B को स्थापित करते हैं, तब तक आप इसे अपने प्रोजेक्ट A के लिए बनाते हैं।

आप प्रोजेक्ट्स का एक सेट बनाने के लिए एक एग्रीगेटर पोम के साथ एक मल्टी-मॉड्यूल प्रोजेक्ट को परिभाषित कर सकते हैं।

यह m2eclipse का उल्लेख करने योग्य भी है , यह मावेन को ग्रहण में एकीकृत करता है और आपको कार्यक्षेत्र से वैकल्पिक रूप से हल करने की अनुमति देता है। इसलिए यदि आप कई प्रोजेक्ट्स को हैक कर रहे हैं, तो संकलन के लिए कार्यक्षेत्र सामग्री का उपयोग किया जाएगा। एक बार जब आप अपने परिवर्तनों से खुश हो जाते हैं, तो उन्हें अपने स्थानीय रिपॉजिटरी में डालने के लिए mvan install (बदले में प्रत्येक प्रोजेक्ट पर, या एग्रीगेटर का उपयोग करके) चलाएं।


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

हां, परियोजनाओं के सेट के निर्माण के लिए मॉड्यूल का उपयोग करते हुए, मूल उत्तर में जोड़ा गया लिंक देखें।
रिच सेलर

5

मेरे जवाब मावेन और आश्रित मॉड्यूल पर एक नज़र डालें ।

Maven रिएक्टर प्लगइन एक परियोजना के हिस्से के निर्माण से निपटने के लिए बनाया गया है।

आप जिस विशेष लक्ष्य का उपयोग करना चाहते हैं reactor:make


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

3

आप कहते हैं कि "वास्तव में सिर्फ बी चाहते हैं", लेकिन यह गलत है। आप बी चाहते हैं, लेकिन आप एक अपडेटेड ए भी चाहते हैं यदि इसमें कोई बदलाव हुआ है ("सक्रिय विकास")।

तो, कभी-कभी आप ए, बी और सी के साथ काम करना चाहते हैं। इस मामले के लिए आपके पास एग्रीगेटर प्रोजेक्ट पी है। उस मामले के लिए जहां आप ए और बी के साथ काम करना चाहते हैं (लेकिन सी नहीं चाहते हैं), आपको एग्रीगेटर प्रोजेक्ट क्यू बनाना चाहिए। ।

संपादित करें 2016 : उपरोक्त जानकारी शायद 2009 में प्रासंगिक थी। 2016 के अनुसार, मैं ज्यादातर मामलों में इसे अनदेखा करने की सलाह देता हूं, और केवल स्वीकृत उत्तर में वर्णित के रूप में -amया -plकमांड-लाइन झंडे का उपयोग कर रहा हूं । यदि आप v2.1 से पहले मावेन के एक संस्करण का उपयोग कर रहे हैं, तो उस पहले को बदल दें :)


Grmphh ... तो मैं परियोजनाओं के रूप में कई एग्रीगेटर परियोजनाओं के साथ समाप्त करूँगा।
क्रिस

@ क्रिस मैं अब इसकी सिफारिश नहीं करूंगा। मैं इसे यहाँ छोड़ दूँगा अगर कोई अभी भी जानना चाहता है कि कैसे, लेकिन मैं हमेशा -am और -pl झंडे का उपयोग करता हूं। मैंने अपना उत्तर अपडेट कर दिया है।
Zac थॉम्पसन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.