मैं इस पोस्ट की लंबाई के लिए माफी माँगता हूं, लेकिन मुझे चित्र प्रस्तुत किए बिना इसे और संक्षिप्त बनाने में परेशानी थी। मैंने हाल ही में एक मैवेन 3.0 मल्टी-मॉड्यूल प्रोजेक्ट के लिए बिल्ड-मास्टर का काम विरासत में मिला है। समस्या यह है कि परियोजना/मॉड्यूल की संरचना एक आपदा है। जिस तरह से चीजें वर्तमान में मॉड्यूल की पोम संरचना में स्रोत नियंत्रण (हम आरटीसी का उपयोग करते हैं) में संग्रहीत हैं, मैं हर बार पूरा निर्माण चक्र पूरा करने की कोशिश कर अपने बालों को फाड़ रहा हूं।मैवेन मल्टी-मॉड्यूल प्रोजेक्ट को पुन: स्थापित कैसे करें?
एक परियोजना पदानुक्रम के रूप में, सभी मॉड्यूल "फ्लैट" संग्रहित होते हैं; यानी: सबकुछ एक ही स्तर पर है। मेरे पास एक अभिभावक पोम है, और सभी मॉड्यूल माता-पिता पर निर्भर करते हैं। हालांकि, माता-पिता मेरे सभी अन्य मॉड्यूल के समान स्तर पर हैं।
पूर्व:
c:\dev\MyEarProject
+ parent-pom
- pom.xml
+ module1
- pom.xml (depends on parent-pom)
- src
- main
- ...
+ module2
- pom.xml (depends on parent-pom)
- src
- main
- ...
+ module3
- pom.xml (depends on parent-pom)
- src
- main
- ...
माता पिता पोम सभी परियोजना है, साथ ही विभिन्न submodules भर में इस्तेमाल विरूपण साक्ष्य संस्करण संख्याओं के लिए गुण का एक समूह बनाने के लिए आवश्यक मॉड्यूल परिभाषित करता है:
<modules>
<module>../module1</module>
<module>../module2</module>
<module>../module3</module>
</modules>
<properties>
<org.springframework.version>3.0.5.RELEASE</org.springframework.version>
<slf4j.version>1.6.4</slf4j.version>
<repositoryAddress>${snapshots.repo.url}</repositoryAddress>
<my.hibernate-module.dao.impl>1.2.3</my.hibernate-module.dao.impl>
<my.hibernate-module.dao.api>1.2.3</my.hibernate-module.dao.api>
</properties>
प्रत्येक मॉड्यूल का पोम बदले में, पोम के आर्टिफैक्ट नंबर के माध्यम से पेरेंट पोम पर निर्भर करता है:
<parent>
<groupId>com.cws.cs.lendingsimulationservice</groupId>
<artifactId>parent-pom</artifactId>
<version>1.0.6</version>
</parent>
चीजों को और भी भ्रमित करने के लिए, वास्तविक आर्टिफैक्ट नाम मॉड्यूल पथ से मेल खा सकता है, या मॉड्यूल के आधार पर नहीं हो सकता है। उदाहरण के लिए, मॉड्यूल 1 पथ c:\dev\MyEarProject\module1
में स्थित हो सकता है लेकिन आर्टिफैक्ट नाम hibernate-module
है। हालांकि, जिस तरह से इसे आरटीसी में संग्रहीत किया जाता है, निर्देशिका को चेक-आउट होने पर module1
कहा जाता है।
सब कुछ बनाने का सबसे आसान तरीका, निश्चित रूप से c:\dev\MyEarProject\parent-pom\
में जाना है और mvn clean deploy
चलाएं। यह ठीक काम करता है जब SNAPSHOT मोड में SNAPSHOT रेपो एक ही आर्टिफैक्ट संस्करण की कई तैनाती की अनुमति देता है। लेकिन रिलीज मोड में, यह विफल रहता है।
यह संरचना मेरे लिए 2 समस्याएं पैदा कर रही है।
- हर मैं माता पिता के गुण से एक संस्करण का परिवर्तन करना होगा, मैं अभिभावक पोम संस्करण संख्या अद्यतन करने के लिए है, और सभी बच्चे माता-पिता पोम के संस्करण मॉड्यूल, और सभी बच्चे संस्करण के लिए खुद को (मॉड्यूल के बाद से माता-पिता बदल गया)।
- जब भी मुझे एक रिलीज चक्र तैनात करने की आवश्यकता होती है, तो एमवीएन एक त्रुटि फेंक देगा यदि अंतिम चक्र के बाद से मॉड्यूल में से कोई भी नहीं बदला गया है और इसके परिणामस्वरूप उसी रेपो में पुन: नियोजित नहीं किया जा सकता है (रेपो मौजूदा कलाकृतियों को ओवरराइट करने की अनुमति नहीं देता है)
तो मैं इन समस्याओं से बचने के लिए इस परियोजना को पुन: स्थापित करने का सबसे अच्छा तरीका ढूंढ रहा हूं। अभिभावक पोम के लिए, मुझे पता है कि मैं इसके बजाय माता-पिता को इंगित करने के लिए एक सापेक्ष पथ का उपयोग कर सकता हूं। हालांकि, मॉड्यूल की "फ्लैट" संरचना को देखते हुए, यह एक अनुशंसित दृष्टिकोण है (यानी: मूल पोम सापेक्ष पथ होगा ../parent-pom/pom.xml - मुझे थोड़ा अजीब लगता है)? इसके अतिरिक्त, एक रिश्तेदार पथ का उपयोग सिर्फ अतिरिक्त भ्रम के लिए द्वार खोल नहीं, यह देखते हुए कि माता पिता की संस्करण नियंत्रण मॉड्यूल के स्वतंत्र है हैं (यानी: कोई रास्ता नहीं माता पिता पोम का कौन सा संस्करण पता करने के लिए किया जाएगा जो संस्करण के साथ जुड़ा हुआ है सबमिशन के)।
दूसरे, मैं कैसे तैनाती त्रुटियों मैं कर रहा हूँ का सामना किए बिना पूरे कान का निर्माण कर सकते हैं? चूंकि आर्टिफैक्ट रेपो में पहले से मौजूद है, इसलिए मुझे इसे पुनर्निर्माण और पुन: नियोजित करने की आवश्यकता नहीं है। मैंने - प्रोजेक्ट्स का उपयोग करने की कोशिश की लेकिन इसमें शामिल मॉड्यूल की संख्या के साथ, इसे प्रबंधित करना बेहद मुश्किल हो जाता है।
दुर्भाग्यवश, वृक्ष संरचना के लिए पुनर्गठन एक विकल्प नहीं है जिस तरह से इस परियोजना के लिए आरटीसी और घटक/मॉड्यूल स्थापित किए गए हैं। तो मुझे वर्तमान स्ट्रिक्यूचर/लेआउट के साथ रहना होगा और स्थिति से बाहर निकलना होगा। सभी बाल मॉड्यूल द्वारा विरासत में प्राप्त होने के लिए मूल स्तर पर संस्करण को रखना अनिवार्य रूप से एक मॉड्यूल में केवल एक बदलाव होने पर भी सभी मॉड्यूल (जो महंगा हो सकता है) पुनर्निर्माण/पुनर्वितरण/पुनर्निर्माण का मतलब है। अनिवार्य रूप से, मैं स्वतंत्र रूप से एक मॉड्यूल संस्करण की क्षमता खो देता हूं। हालांकि मैं सहमत हूं; यह मेरी तैनाती की समस्या को हल करेगा। –
यदि आप मेवेन के खिलाफ लड़ना जारी रखना चाहते हैं तो यह आपकी बारी है लेकिन मैं संरचना को बदलने की सलाह देता हूं क्योंकि यह आपके जीवन को आसान बना देगा। लेकिन अगर प्रत्येक मॉड्यूल को अलग से तैनात करने के बारे में विचार समझ में नहीं आता है। या तो वे संबंधित हैं हैं नहीं हैं। यदि वे आपके से नहीं हैं तो उन्हें वास्तव में अलग करना चाहिए और बहु-मॉड्यूल निर्माण का उपयोग न करें। – khmarbaise
मुझे यह समझने में समस्या हो रही है कि संस्करण संख्या के साथ ऐसा करने के लिए केवल माता-पिता में परिभाषित किया गया है। मेरे वर्तमान सेटअप में, मैं शेष संस्करण को प्रभावित किए बिना मॉड्यूल में इंटरफ़ेस को बदल सकता हूं जब तक कि यह नया संस्करण पुन: व्यवस्थित करने का समय न हो। केवल माता-पिता में संस्करण के साथ, मॉड्यूल के इंटरफ़ेस को बदलने से शेष निर्माण टूट जाएगा क्योंकि सभी मॉड्यूल स्रोत पेड़ पर निर्भर होंगे और पूर्व-तैनात बाइनरी नहीं होंगे। मैं इस समस्या से कैसे बचूं? मुझे अभी भी प्रत्येक मॉड्यूल को अलग-अलग संस्करण की आवश्यकता है, है ना? –