मल्टी-मॉड्यूल मावेन प्रोजेक्ट बनाने के लिए एक बड़ी परियोजना का विभाजन


23

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

वर्तमान में, हम ROOT.warअपने सर्वर पर Apache tomcat पर एक एकल WAR फ़ाइल तैनात कर रहे हैं । जैसे-जैसे प्रोजेक्ट बड़ा होता है, वेबपेज में नोटिफिकेशन और ईमेल, थर्ड पार्टी सर्विसेज़, PUSH (Cometd), REST API इत्यादि जैसे भाग आते हैं। वर्तमान में ये सभी क्लब हैं और एक-दूसरे पर निर्भर हैं। उदाहरण के लिए, Notificationऑब्जेक्ट ऑब्जेक्ट पर भी निर्भर करता है Person, क्योंकि सूचनाएँ उपयोगकर्ताओं के लिए अनुरूप हैं।

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

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

जैसा कि मैंने कहा, इरादा व्यक्तिगत मॉड्यूल पर काम करना और उन्हें (अधिमानतः गर्म) तैनात करने में सक्षम होना है। वर्तमान में, हमारे पास केवल एक WAR फ़ाइल है ROOT.war। बंटवारे से कई युद्ध फाइलें बनेंगी, जिन्हें तब URL के रूप में संदर्भित किया जाता है domain-name.com/module_name/some_mapping?

मैं वर्तमान में दस्तावेज़ीकरण की जाँच कर रहा हूं, लेकिन यह प्राथमिक उद्देश्य है जिसे हम मावेन द्वारा प्रदान किए गए मल्टी मॉड्यूल के साथ प्राप्त करना चाहते हैं और यह जानना संभव है कि क्या यह संभव है। यदि किसी और जानकारी की आवश्यकता है, तो कृपया मुझे बताएं।

वर्तमान में मैं वसंत से एक मूल POM का उपयोग कर रहा हूं:

<parent>
    <groupId>io.spring.platform</groupId>
    <artifactId>platform-bom</artifactId>
    <version>1.1.3.RELEASE</version>
    <relativePath />
</parent>

1
मैं इसका जवाब देने के लिए दूसरों पर छोड़ता हूं। विचार बहुत ध्वनि है। आप पेरेंट पोम पर निर्भरता प्रबंधन के साथ शुरू कर सकते हैं, और व्यक्ति की तरह DAO के लिए जार। एक बहुत ही बुनियादी पुस्तकालय। और इसी तरह। बेशक कोई चक्रीय निर्भरता नहीं।
जोप इगेनेन

जवाबों:


20

क्या यह संभव है ?

हां बेशक। मेरे पास पिछली संरचना में कुछ परियोजनाएं हैं जैसे, यहां कुछ बिट्स मुझे आशा है कि आप शुरू कर देंगे।

मावेन की दो मुख्य विशेषताएं हैं जिनका उपयोग आप चीजों को एक साथ करने के लिए करेंगे:

विभाजन और जीत

आपको अपनी परियोजनाओं को कई स्वतंत्र परियोजनाओं में विभाजित करना होगा। यहां स्वतंत्र से मेरा मतलब है कि परियोजना के बाहर कोड के सभी संदर्भ मावेन में निर्भरता के माध्यम से किए जाते हैं और स्रोत पेड़ को सीधे विलय नहीं करते हैं।

आपके स्रोत वृक्ष की स्थिति के आधार पर यह बहुत काम का प्रतिनिधित्व कर सकता है। यह कहा कि आप मावेन को जूते मारने के लिए नहीं कर रहे हैं बल्कि एक संरचना के रूप में और अपने कोड आधार को साफ करने के लिए कर रहे हैं। इसे अपने टूलशेड के रूप में सोचें, यहां चीजें ढूंढना बहुत आसान है:

अच्छा टूलशेड

यहाँ से:

नहीं, तो अच्छा टूलशेड

मावेन सम्मेलन पर बहुत अधिक निर्भर करता है इसलिए बेहतर संगठित आपका सामान अधिक मावेन आपकी मदद कर सकता है। उस ने कहा, आपको अपने स्वयं के सम्मेलन को बेहतर ढंग से फिट करने के लिए इसे फिर से व्यवस्थित करने की आवश्यकता हो सकती है और अगर मुझे यहां एक सलाह देनी है तो यह है कि मावेन के सम्मेलनों को फिट करने के लिए अपने सामान को बदलना आसान है, क्योंकि यह कोशिश करना और उन्हें कॉन्फ़िगर करना है अपने सम्मेलन को समझें।

यदि ये परियोजनाएं मुख्य अनुप्रयोग के बाहर प्रयोग करने योग्य हो सकती हैं तो वे वास्तव में स्वतंत्र पुस्तकालयों के रूप में रह सकते हैं और इसमें मावेन निर्भरता भी शामिल है। उन्हें अपने स्वयं के भंडार में रहना चाहिए (आवेदन स्रोत के पेड़ में नहीं) और मुख्य आवेदन के किसी भी हिस्से पर निर्भर नहीं होना चाहिए।

आपके एप्लिकेशन के मुख्य भाग, एक बार परियोजनाओं में विभाजित होने पर मॉड्यूल के रूप में एक साथ रखे जा सकते हैं। आमतौर पर आपने उन्हें अपने ऐप के मुख्य स्रोत फ़ोल्डर के उप-फ़ोल्डर के रूप में रखा होगा।

इसके अलावा आपके ऐप के लिए आपके मूल POM में मॉड्यूल की घोषणा शामिल होगी। आप अपने ऐप के लिए सभी सामान्य निर्भरता में जगह बनाएंगे और साथ ही अधिकांश बिल्ड प्लगिन और उनके कॉन्फ़िगरेशन की घोषणा करेंगे। यहाँ में भी मैं आपको उन चीजों के लिए गुणों का एक समूह देता हूं, जैसे कि एप्लिकेशन का संस्करण जो आप मॉड्यूल में पुन: उपयोग कर सकते हैं। जब सब कुछ एक ही संस्करण है और एक ही स्थान पर संस्करण होने का प्रबंधन करने के लिए बहुत आसान यह सिर्फ काम करता है।

टूलींग

यदि आप 1 से बड़ी टीम हैं, तो मैं भी दृढ़ता से कहता हूं कि आप अपने मावेन निर्भरता के लिए एक भंडार स्थापित करें। को देखो Artifactory , नेक्सस या Archiva । आप इन्हें सीधे इंस्टॉल करने के लिए POM फाइल को कॉन्फ़िगर कर सकते हैं ताकि एक बार चलने के बाद यह ओवरहेड का अधिक न हो लेकिन आपकी टीम को सही जगह पर सही जार के साथ निर्भरता को हल करने में बहुत समय बचाएगा।

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

चूंकि आप युद्ध के निर्माण के लिए अपने ऐप की पैकेजिंग कर रहे हैं , युद्ध के निर्माण को संभाल सकते हैं और जार फ़ाइलों या अन्य समान कार्यों को मर्ज किए बिना सभी निर्भरता को उनके उचित स्थानों पर रख सकते हैं, इसलिए वहां कोई चिंता नहीं है।

उदाहरण

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

उदाहरण के लिए जेनकिंस लें :

आप देख सकते हैं कि उनके अभिभावक POM काफी व्यापक हैं।

वे मॉड्यूल का उपयोग करते हैं जैसा कि आप इस अनुभाग में देख सकते हैं:

<modules>
    <module>core</module>
    <module>war</module>
    <module>test</module>
    <module>cli</module>
</modules>

और प्रत्येक मॉड्यूल एक उप-फ़ोल्डर के साथ एक ही नाम से मेल खाता है जिसमें POM भी शामिल है। आप इस तरह से जितने चाहें उतने घोंसले बना सकते हैं, हालांकि इसे पवित्रता के स्तर के भीतर रखें;)।

छोटा शुरू करो

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

मावेन एक महान उपकरण है लेकिन यह गर्दन में एक सुपर दर्द भी हो सकता है, खासकर जब चीजें आपके रास्ते में नहीं जा रही हों। अपने पहले जाने पर पूरे धाम से शुरू करना आपदा के लिए एक प्राप्तकर्ता है (मेरे लिए था!)।

यदि चीजें थोड़ी अजीब हैं, तो आप हमेशा mvn help:effective-pomयह देखने के लिए कमांड का उपयोग कर सकते हैं कि मावेन वास्तव में क्या समझ रहा था।

प्लग-इन

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

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

यदि आपको आगे बढ़ने की आवश्यकता है तो एक बालक थोड़ा अधिक जटिल हो जाएगा, हालांकि असंभव नहीं है। मुझे लगता है कि आप OSGI को देख लेंगे, Apache फेलिक्स आपको आरंभ कर सकता है, हालांकि अन्य कार्यान्वयन भी हैं। इससे आप बाहरी जार ले सकते हैं और उन्हें उचित प्लग इन में बना सकते हैं। आप गतिशील रिलोड और अपडेट के लिए दरवाजा खोलने वाले घटकों के रनटाइम जीवनचक्र पर बहुत अधिक नियंत्रण प्राप्त करेंगे। हालांकि इसे फिर से अपने मूल में बड़े बदलाव की आवश्यकता होगी, शायद एक अच्छा प्रारंभिक बिंदु नहीं। हालाँकि एक बार जब आपके पास एक परियोजना होती है जो अच्छी तरह से अलग हो जाती है और सभी भागों को आपके इच्छित तरीके से अलग कर दिया जाता है, तो यह एक स्वाभाविक अगला कदम हो सकता है यदि आवेदन शुरू करना और अपडेट पर रोकना एक बड़ी समस्या है।

मॉड्यूल और निर्भरता के बीच मूल अंतर यह है:

  • मॉड्यूल मुख्य स्रोत के रूप में एक ही स्रोत के पेड़ में रहेंगे, आदर्श रूप से उप-फ़ोल्डर्स के रूप में।
  • निर्भरता कहीं भी हो सकती है।

आप यहाँ बाइबिल पा सकते हैं ।

उम्मीद है कि इससे मदद करेगी, सुसंयोग।


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

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

मुझे लगता है कि हम अपनी परियोजना के कुछ हिस्सों को सीधे मावेन निर्भरता के रूप में जोड़ने के लिए जाएंगे। इस तरह, हम सीधे परियोजना के कुछ हिस्सों पर काम कर सकते हैं। बस एक प्रश्न मेरे पास था, अगर हम POM.xml में एक निर्भरता के रूप में उप-परियोजनाओं में से एक को जोड़ते हैं, तो संस्करण 2.0.0, और फिर कुछ परिवर्तनों के साथ, हम मॉड्यूल के 2.0.1 को सोनाटाइप में धक्का देते हैं, हम कैसे कर सकते हैं सीधे 2.0.1 के लिए जाने के लिए कोर-मॉड्यूल को बताएं, बस ROOT.war के अंदर POM.xml को बदलना होगा और रूट निर्देशिका को हटाना पर्याप्त होगा। मुख्य इरादा सर्वर को बंद करना नहीं है। धन्यवाद।
हम

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