2009-10-01 32 views
18

निर्माण मैं जानता हूँ कि यह एक ही दिन में दो बार पूछने के लिए mauvais ton है, लेकिन यहाँ एक और Maven पहेली है:Maven - छोड़ माता पिता परियोजना

मैं एक माता पिता पोम जो 5 मॉड्यूल (5 उप) को परिभाषित करता है है। चूंकि प्रत्येक मॉड्यूल को उसी तरह से निष्पादित किया जाता है जैसे मैं डुप्लिकेट कोड से छुटकारा पाने के लिए पैरेंट पीओएम में <profile><build> अनुभाग खींचता हूं। अब - यदि मैं प्रत्येक मॉड्यूल से व्यक्तिगत रूप से निर्माण निष्पादित करता हूं, तो यह काम करता है, हालांकि अगर मैं एक बार में सभी मॉड्यूल बनाना चाहता हूं और मूल निर्देशिका में जाना चाहता हूं तो मुझे त्रुटि मिली क्योंकि मैवेन निष्पादित करने की कोशिश करता है, पहली परियोजना मैनेजेंट प्रोजेक्ट ही है:

mvn package -P release 
[INFO] Scanning for projects... 
[INFO] Reactor build order: 
[INFO] DWD Parent project 
[INFO] Projects 

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

पीएस भ्रम को रोकने के लिए - मैं माता-पिता पर प्रोफ़ाइल निष्पादन को दबाने की कोशिश कर रहा हूं और इसे same

+0

मुनाफा: Maven, संभव नहीं रचना के लिए समर्थन की कमी है अगर आप केवल माता-पिता – sibidiba

उत्तर

9

माता-पिता का निर्माण करके क्या गलत है?

  • माता पिता पोम
  • मॉड्यूल एकत्रीकरण

पहले एक:

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

जब आप इस माता-पिता का बच्चा बनाते हैं, तो मैवेन 2 इस माता-पिता को बच्चे के पोम के साथ पैरेंट पोम को मर्ज करने के लिए पुनर्प्राप्त करेगा। mvn help:effective-pom कमांड चलाकर आप पूरे pom.xml पर एक नज़र डाल सकते हैं।

इस मामले में, मूल पोम नहीं बनाया जाएगा, इसे केवल भंडार से पुनर्प्राप्त किया जाएगा।

दूसरा मामला एक प्रोजेक्ट है जिसमें उप-परियोजनाओं की modules सूची शामिल है। सिद्धांत यह है कि इस प्रोजेक्ट पर आपके द्वारा चलाए जाने वाले प्रत्येक आदेश को सभी उप-मॉड्यूल पर भी चलाया जाएगा। मॉड्यूल का क्रम रिएक्टर द्वारा परिभाषित किया जाएगा, जो इंटर-मॉड्यूल निर्भरताओं को देखने के लिए देखेंगे कि कौन सा मॉड्यूल दूसरों के सामने बनाया जाना चाहिए। यदि कोई निर्भरता नहीं है, तो यह मॉड्यूल की सूची ले जाएगा क्योंकि उन्हें मूल pom.xml में परिभाषित किया गया है।

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


संपादित करें, RichSeller टिप्पणी

बहु मॉड्यूल (एकत्रीकरण परियोजना) और विरासत (मूल परियोजना) के बीच मतभेद की एक पूर्ण विवरण के लिए धन्यवाद, here Maven पुस्तक में पाया जा सकता है।

+0

+1 को इंगित करने के लिए संशोधित कर दूंगा कि, अधिक जानकारी के लिए मेवेन बुक देखें: http://www.sonatype.com/books/maven-book/reference/ पोम-रिलेशनशिप-सेक्ट-मल्टी-बनाम वारिस.html –

+0

हां, मैं इसे इंगित करना चाहता था क्योंकि आम तौर पर लोग सोचते हैं कि एकत्रीकरण और मूल परियोजना एक ही चीज़ है और इसे अलग से इस्तेमाल नहीं किया जा सकता है। – romaintaz

+2

माता-पिता के निर्माण में क्या गड़बड़ है? सरल - प्रोफाइल में क्या होता है बच्चों पर लागू होता है लेकिन माता-पिता के लिए कोई समझ नहीं आता है। आपके बिंदु पर - मुझे दोनों की आवश्यकता है: एकत्रीकरण और पुन: प्रयोज्य कोड खींचने की क्षमता। प्रोफाइल सक्रियण - जैसा कि रिच विक्रेता द्वारा टिप्पणी की गई है, सही समाधान – Bostone

14

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

स्पष्टीकरण के लिए अद्यतन: मेरे परीक्षण प्रोजेक्ट पर इस कॉन्फ़िगरेशन का अर्थ है कि प्रोफ़ाइल मूल परियोजना (जिसमें स्रोत/मुख्य/संसाधनों में फ़ाइल है) में निष्क्रिय है, लेकिन उन सभी बाल परियोजनाओं में सक्रिय है जिनके पास फ़ाइल नहीं है संसाधन निर्देशिका।

<profile> 
    <id>test</id> 
    <activation> 
    <file> 
     <missing>src/main/resources/test.marker</missing> 
    </file> 
    </activation> 
    ... 
</profile> 
+1

रिच से निर्माण - कि इसका जवाब मैं चाहता है! रोमानीटज़ के बिंदुओं के लिए - मैं दोनों चाहता हूं: अभिविन्यास और माता-पिता को सामान्य कोड खींचने की क्षमता (जिसे उस कोड को निष्पादित करने का कोई अर्थ नहीं है)। – Bostone

+0

रिच - अगर मैं आपको थोड़ा और परेशान कर सकता हूं। मैं गायब फ़ाइल की बजाय संपत्ति का उपयोग करके एक ही प्रभाव प्राप्त करने की कोशिश कर रहा हूं। यह काम नहीं करता है। यहां तक ​​कि जब मैं अपने बच्चे के पीओएम में संपत्ति घोषणा करता हूं तब भी मेरी प्रोफ़ाइल कभी सक्रिय नहीं होती है। ऐसा क्यों है? क्या गुण "पूर्व-निर्मित" घोषित किए गए हैं और कभी भी रीसेट नहीं किए जाते हैं?शायद मुझे एक और सवाल पूछना चाहिए ताकि मैं कोड उदाहरण डाल सकूं? – Bostone

+0

नहीं, इसे संपत्ति उपस्थिति के आधार पर सक्रिय करना चाहिए (http://maven.apache.org/guides/introduction/introduction-to-profiles.html पर एक उदाहरण है), अगर आप नहीं प्राप्त कर सकते हैं तो एक और सवाल पूछने के लिए स्वतंत्र महसूस करें यह –

4

मैं दस्तावेज़ करना चाहता हूं कि मेरी स्थिति में आंशिक समझौता हो (सुझाव के लिए मेवेन उपयोगकर्ताओं मेलिंग सूची पर लोगों के लिए धन्यवाद)। असल में आपको दो टुकड़ों में प्रोफाइल काटना होगा। प्लगइन का पुन: प्रयोज्य configuration अनुभाग पीओएम में जाता है, और executions बच्चे पीओएम में रहता है। फिर बच्चे में प्रोफाइल प्लगइन को inherited और वॉयला के रूप में चिह्नित किया जाता है - रन टाइम पेरेंट प्रोफाइल पर निष्पादित नहीं किया जाता है क्योंकि यह executions अनुभाग गुम है। यह आदर्श से बहुत दूर है लेकिन यह काम करता है। उदाहरण के लिए to this link देखें

+0

काम नहीं कर सकता, दिलचस्प है, इसे यहां पोस्ट करने के लिए धन्यवाद। हालांकि, क्या लिंक काम करता है या यह सिर्फ मुझे है? –

+0

मेरे लिए काम करता है, लेकिन आप पूर्ण संस्करण http://mail-archives.apache.org/mod_mbox/maven-users/200812.mbox/%[email protected]%3E – Bostone

+0

पूर्ण संस्करण काम कर सकते हैं, एक छोटा नहीं है। धन्यवाद। –

2

मैं उपरोक्त रिक विक्रेता द्वारा प्रदान किए गए "अनुपलब्ध" फ़ाइल समाधान को लागू करने में सक्षम नहीं था। ऐसा लगता है कि प्रोफ़ाइल के सक्रिय/गैर-सक्रिय स्थिति को एक बार सेट नहीं किया जाएगा, यहां तक ​​कि मॉड्यूल से मार्कर फ़ाइल गायब है। हालांकि यहां मेरी समस्या का सही समाधान है। चेतावनी: foo और नियमित रूप से परिस्थितियों में तो बू निष्पादन के आदेश हो जाएगा::

  1. माता पिता
  2. foo यह केवल उपलब्ध Maven 2.1+

    के साथ शुरू अगर मैं परिभाषित 2 मॉड्यूल के साथ एक माता पिता पोम है

  3. बू

सभी मैं माता पिता के निर्माण को छोड़ने के लिए क्या करने की जरूरत इस आदेश पंक्ति स्विच

जोड़ने के लिए है

mvn install –rf foo

वैकल्पिक रूप से आप --resume-from का उपयोग कर सकते हैं माता-पिता को छोड़ना और foo मॉड्यूल से जारी रखना क्या होगा। अब - मैं की जांच कर रहा हूँ इस रिएक्टर प्लगइन कॉन्फ़िगर करके प्राप्त किया जा सकता है, तो (पी एस - नहीं ऐसा नहीं कर सकते हैं) लेकिन फिर भी स्विच के साथ, उपरोक्त परिदृश्य मुझे

1

के लिए ठीक काम करता है यह @ romaintaz के जवाब द्वारा निहित है एक ही प्रश्न के लिए, Maven - skip parent project build

लेकिन यह स्पष्ट करने के लिए, मूल पोम में यह अनिवार्य है कि आप पैकेजिंग तत्व को पोम (और जार या युद्ध नहीं) के रूप में निर्दिष्ट करते हैं।
उदाहरण:

<packaging>pom</packaging> 
संबंधित मुद्दे