2013-07-05 10 views
10

हमारे पास विरासत की तीन "वास्तविक" परतों और मॉड्यूल एकत्रीकरण की तीन से चार परतों के साथ एक बड़ी और गहरी मॉड्यूल संरचना है।मेवेन मॉड्यूल विरासत बनाम एकत्रीकरण

मैं वास्तविक विरासत के साथ ठीक हूं: उत्पाद की अनुकूलन के लिए एक कंपनी के विस्तृत सुपर-पोम, उत्पाद-व्यापी माता-पिता और ग्राहक-व्यापी माता-पिता।

लेकिन मैं देखता हूं कि "रिक्त" समेकित मॉड्यूल को उनके submodules के माता-पिता के रूप में परिभाषित किया जाता है।

यदि पूरी अवधारणा ओओ में समान है, तो यह मेरे लिए कोई समझ नहीं आता है कि समेकित मॉड्यूल (वे अपने submodules के अलावा खाली हैं) पोम को कोई विशिष्ट विन्यास नहीं जोड़ते हैं।

क्या कोई अन्य कारण है (शायद परिचालन) यह उपयोगी क्यों हो सकता है?

सिडेनोट: पोम का परिचय इस संबंध में स्पष्ट नहीं है: शब्द "माता-पिता" स्पष्ट नहीं है: इसका अर्थ सुपर-पोम (= विरासत वृक्ष में माता-पिता) या योग को जोड़ना (= फाइल सिस्टम में पैरेंट ...)

+0

से यह प्राप्त नहीं होता है, यह आपके प्रश्न का उत्तर नहीं देता है, लेकिन यदि आपने विरासत से एकत्रीकरण अलग किया है (जो मैं भी करता हूं) आप अपने एग्रीगेटर पोम्स से क्यों विरासत में हैं? समेकित पोम्स में अनुभाग निर्दिष्ट नहीं करते हैं या आपके असली माता-पिता से प्राप्त नहीं होते हैं। असल में, _ "रिक्त" समेकित मॉड्यूल को परिभाषित किया जाता है क्योंकि उनके submodules_ के माता-पिता अनिवार्य नहीं हैं। अगर ऐसा नहीं होता है तो इसे मत करें – Hilikus

उत्तर

12

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

app-api/ 
app-impl/ 
app-war/ 
app-parent/ 
pom.xml 

जहां pom.xml मॉड्यूल पोम है।

लेकिन खुले स्रोत क्षेत्र में आप लगभग हर परियोजना को देखेंगे, उनके बीच अंतर नहीं है।

इसका एक कारण है: कई प्लगइन्स भी उनके बीच विचलित नहीं होते हैं। और यहां तक ​​कि मैवेन भी एक और सेटिंग मानते हैं: यदि <relativePath> सेट नहीं किया गया है तो मैवेन मानते हैं कि माता-पिता .. पर हैं। तो प्रत्येक परियोजना को माता-पिता के रूप में <relativePath>../app-parent</relativePath> पर इंगित करना होगा।

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

सबसे खराब बग यह है कि रिलीज-प्लगइन आपके माता-पिता में संस्करण-गुणों को प्रतिस्थापित नहीं कर सकता है और SNAPSHOT-Dependencies के कारण विफल रहता है। इन गुणों को रिहा आम तौर पर, जबकि स्वचालित रूप से उनकी रिहाई संस्करण 1.1 और 1.2 पर सेट किया जाएगा आपके अभिभावक ने शायद इस

<properties> 
    <app-api.version>1.1-SNAPSHOT</app-api.version> 
    <app-impl.version>1.2-SNAPSHOT</app-impl.version> 
</properties> 

<dependencyManagement> 
    <dependencies> 
     <dependency> 
      <groupId>myorg</groupId> 
      <artifactId>app-api</artifactId> 
      <version>${app-api.version}</version> 
     </dependency> 

     <dependency> 
      <groupId>myorg</groupId> 
      <artifactId>app-impl</artifactId> 
      <version>${app-impl.version}</version> 
     </dependency> 
    </dependencies> 
</dependencyManagement> 

की तरह कुछ शामिल होंगे। लेकिन रिलीज-प्लगइन (संस्करण 2.2.2 तक परीक्षण) एक संदेश के साथ विफल रहता है कि मॉड्यूल स्नैपशॉट निर्भरताओं के साथ जारी नहीं किया जा सकता है।

यदि आप कुछ मॉड्यूल-पोम्स को केवल "छोड़ें" तो यह समस्या नहीं हो सकती है जब आप <relativePath> को सही तरीके से परिभाषित करते हैं। लेकिन आपको मेवेन प्लगइन्स में कुछ बग्स को आजमाने और उम्मीद करने की ज़रूरत है। इन बगों के अलावा आप पूरी तरह से पोम्स को अलग करने का अधिकार रखते हैं और यदि आपके पास सैंडबॉक्स वाली रिलीज करने का समय है तो मैं इसे आज़मा दूंगा।

+2

ऐसा करने के बेहतर तरीके को न्यायसंगत बनाने का एक और तरीका यह है कि यह "चिंताओं को अलग करना" प्रदान करता है। विरासत और आंदोलन के विचारों को अलग करके, दोनों ही अधिक लचीला हो सकते हैं। –

0

यदि आपके पास कई प्रोजेक्ट्स के लिए मान्य गुण हैं तो माता-पिता पोम का विरासत उपयोगी होता है।जो मैंने समझा है, उससे आपको पहले से ही वह हिस्सा मिला है ;-)

जो आप समेकित मॉड्यूल को कॉल करते हैं, उसका भी वैध व्यावहारिक उपयोग होता है। आप कई पनडुब्बियों को एक ही पोम में समूहित कर सकते हैं। यदि आप अपनी परियोजना बनाना चाहते हैं तो आप अधिकतर प्रत्येक मॉड्यूल को अलग-अलग बनाना नहीं चाहते हैं बल्कि उन्हें एक ही एप्लिकेशन में शामिल करना चाहते हैं। यह ऐसे पोम द्वारा किया जा सकता है जो सभी submodules के रूप में संदर्भित करता है। यह केवल माता-पिता पोम की अवधारणा के साथ नहीं किया जा सकता है क्योंकि यह अन्य मॉड्यूल के बारे में कुछ भी नहीं जानता है।

0

संक्षिप्त उत्तर IIUC है, आप अपने एकत्रीकरण-केवल पोम्स से प्राप्त नहीं हैं। आप करते हैं जब आपका एग्रीगेटर आपके माता-पिता के समान होता है, जैसा कि कैनोलिक मैवेन स्ट्रक्चर में होता है। लेकिन यदि आप अभिभावक से एग्रीगेटर अलग करते हैं, तो एग्रीगेटर

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