2009-07-11 41 views
228

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

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

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

मैं इस प्रश्न से समझता हूं: Maven and dependent modules शायद मैवेन वास्तव में इस प्रकार के निर्भरता संकल्प के लिए डिज़ाइन नहीं किया गया है, लेकिन यह सवाल पूछता है कि मैं B कैसे पैकेज करूं?

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

  2. क्या मुझे B पैकेज करने के लिए हर बार अपने स्थानीय भंडार में ए के स्नैपशॉट इंस्टॉल करना होगा?

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

यहां कोई सर्वोत्तम अभ्यास है?

+0

[मेवेन और आश्रित मॉड्यूल] के संभावित डुप्लिकेट (http://stackoverflow.com/questions/808516/maven-and - निर्भर-मॉड्यूल) – oberlies

उत्तर

448

यहां कोई सर्वोत्तम अभ्यास है?

उपयोग Maven advanced reactor options, और अधिक विशेष:

-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 

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

+12

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

+14

एक और बहुत उपयोगी विकल्प "-amd, --also-make-dependents" है, जो रिएक्टर सूची में प्रोजेक्ट्स पर निर्भर सभी मॉड्यूल बनाता है। – deterb

+0

एक पोलैंड मॉड्यूल बनाने के बारे में क्या? – Bax

6

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

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

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

+1

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

+0

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

+0

404 त्रुटि आपके बहु-मॉड्यूल प्रोजेक्ट लिंक। –

7

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

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

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

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

+2

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

2

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

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

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

+0

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

+0

@ क्रिस मैं अब इसकी अनुशंसा नहीं करूंगा। अगर मैं अभी भी जानना चाहता हूं तो मैं इसे यहां छोड़ दूंगा, लेकिन मैं हमेशा -am और -pl झंडे का उपयोग करता हूं। मैंने अपना जवाब अपडेट कर दिया है। –

5

मेरा उत्तर Maven and dependent modules पर एक नज़र डालें।

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

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

+2

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

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