2017-11-16 36 views
12

से एक बम प्रकाशित करें हम लगभग 2000 अलग जावा परियोजनाओं वाली एक बड़ी कंपनी हैं। ऐतिहासिक कारणों से, हमारे पास बहु-मॉड्यूल परियोजनाएं नहीं हैं, लेकिन हम उन्हें पेश करना चाहते हैं।एक बहु-मॉड्यूल-प्रोजेक्ट

तार्किक रूप से, हमारे पास पहले से ही परियोजनाओं के "समूह" हैं, यानी 50 परियोजनाओं के लिए जिम्मेदार कोई (जो) निकटता से संबंधित है। यह कोई नियमित रूप से एक बीओएम प्रकाशित करता है जिसमें इन 50 परियोजनाओं के हालिया, सुसंगत संस्करण शामिल हैं।

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

तो, संक्षेप में, हमें एक बीओएम की आवश्यकता है जिसमें बहु-मॉड्यूल परियोजना का हिस्सा हैं जो सभी 50 परियोजनाओं के संस्करण शामिल हैं। मुझे आश्चर्य है कि इस तरह के एक बीओएम बनाने के लिए "मेवेन रास्ता" क्या होगा। मैं इसके बारे में क्या सोच सकता हूं:

  • बम बहु-मॉड्यूल प्रोजेक्ट की 51 वीं परियोजना है। निर्भरताओं के संस्करण माता-पिता पोम में गुणों द्वारा निर्धारित किए जाते हैं।
  • बम बहु-मॉड्यूल प्रोजेक्ट में मौजूद जानकारी से उत्पन्न होता है और साइड आर्टिफैक्ट के रूप में प्रकाशित होता है (यह शायद हमें इसके लिए एक मेवेन प्लगइन लिखने की आवश्यकता है)।

क्या सलाह दी जाएगी?

+0

परियोजनाओं से आपका मतलब कुछ भी है - एक स्टैंडअलोन ऐप या lib? और आप अन्य परियोजनाओं (ऐप्स और libs दोनों) में उन libs (लेकिन ऐप्स नहीं) का संदर्भ देते हैं? और आप 1 प्रोजेक्ट में एकाधिक libs को समूहित करना चाहते हैं और उन्हें सभी को एक इकाई (बीओएम) के रूप में प्रकाशित करना चाहते हैं? –

+1

यह स्पष्ट नहीं है कि आप वास्तव में क्या हासिल करना चाहते हैं। –

+0

@ ThorbjørnRavnAndersen मैं स्पष्ट करना चाहता हूं, लेकिन क्या आप मुझे बता सकते हैं कि कौन से हिस्से आपके लिए अस्पष्ट हैं? –

उत्तर

4

हम बीओएम का उपयोग हमारी बहु-मॉड्यूल परियोजनाओं के लिए भी कर रहे हैं, लेकिन हम उन मॉड्यूल के निर्माण के लिए अपनी पीढ़ी या अद्यतन नहीं लगा रहे हैं।

एक बीओएम केवल तभी अपडेट किया जाता है जब हमारी रिलीज प्रबंधन प्रक्रिया एक निर्मित मॉड्यूल (या मॉड्यूल के समूह) की डिलीवरी को पूरा करती है: एक बार डिलीवर किया जाता है, फिर बीओएम अपडेट किया जाता है और नेक्सस को धक्का दिया जाता है (1.0-स्नैपशॉट संस्करण के रूप में संग्रहीत किया जाता है) प्रत्येक डिलीवरी)

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

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

+0

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

+0

@ जेएफएमयर बिल्कुल: यही कारण है कि मैंने एक रिकॉर्डर विकसित किया है: डिफ़ॉल्ट रूप से बिल्ड * बीओएम का उपयोग नहीं करता है, लेकिन एक विशेष निर्भरता प्रबंधन अनुभाग जिसमें संस्करण सेट हैं। मांग पर, रिकॉर्ड की गई प्लगइन बीओएम पढ़ती है, और बीओएम संस्करण के साथ उस विशेष खंड को प्रतिस्थापित करती है। चूंकि pom.xml गिट रेपो में है, इसलिए कोई भी उस प्लगइन पर प्रत्येक कॉल के बाद रिकॉर्ड किए गए संस्करण परिवर्तनों का पालन कर सकता है। लेकिन डिफ़ॉल्ट रूप से, कोई प्लगइन नहीं कहा जाता है, और "विशेष निर्भरता प्रबंधन अनुभाग" का पुन: उपयोग किया जाता है, संस्करण के एक निश्चित सेट के साथ, स्थिरता सुनिश्चित करने के लिए। – VonC

+0

@JFMeier लक्ष्य का जवाब देना है: किस संस्करण के साथ मुझे अपनी परियोजना का निर्माण करना है?मांग पर, आप उन संस्करणों को "वर्तमान में तैनात किए गए" के रूप में प्राप्त कर सकते हैं (बीओएम पढ़ना, आपके लिए pom.xml को संशोधित करना)। लेकिन अन्य सभी निर्माण उदाहरण के लिए, आप बस पहले सेट किए गए उपयोग का उपयोग कर रहे हैं (फिर से: स्थिरता बनाएं) – VonC

4

मैं वाणिज्यिक जावा परियोजनाओं के 2K कभी नहीं देखा है, तो कैसे खुला स्रोत पर मेरा उत्तर का आधार होगा काम करता है:

  • पुस्तकालय लोगों के आधार पर वर्गीकृत नहीं किया जाना चाहिए - वे समस्याओं के आधार पर वर्गीकृत किया जाना चाहिए कि वे हल करते हैं। अक्सर ओपन सोर्स प्रोजेक्ट्स में कई libs होते हैं उदा। जैक्सन में jackson-databind, jackson-datatype-jsr310, आदि हैं। ये libs प्रत्येक से कसकर संबंधित हैं और एक दूसरे पर निर्भर हो सकते हैं।
  • ऐसे समूह बहुत बड़े नहीं होने चाहिए। कुछ परियोजनाओं में 1, अन्य - 5 या 10. समूह में 50 libs बहुत अधिक लगता है।
  • समूह में libs एक ही समय में सभी (यहां तक ​​कि अगर केवल एक अपडेट किया गया है) जारी किया जाता है तो यह आसान है। यह उन ऐप्स में संस्करणों का ट्रैक रखने के लिए सीधा बनाता है जो समूह से कई libs का उपयोग करते हैं।
  • समूह के बीच कोई निर्भरता नहीं होनी चाहिए! और यह शायद सबसे महत्वपूर्ण नियम है। एक-दूसरे पर निर्भर पुस्तकालयों की गहरी पदानुक्रम स्वीकार्य नहीं है क्योंकि अब आपको कई परियोजनाओं और libs के बीच संगतता रखने की आवश्यकता है। यह सिर्फ पैमाने पर नहीं है। जिसका अर्थ है कि libs के बीच कभी-कभी कॉपी-पेस्ट कोड होगा - यह कम बुराई है।
  • अंतिम नियम (शायद एक lib जो हर जगह) का उपयोग किया जा सकता है, लेकिन उन लोगों को सार्वजनिक एपीआई की पिछड़े संगतता को तब तक रखना चाहिए जब तक पुरानी एपीआई पर निर्भर कोई परियोजना न हो। इस तरह के libs बनाए रखने के लिए बहुत मुश्किल हैं और उन्हें खोलने के लिए बेहतर है।

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

  • आप <scope>import</scope> जो एक समूह के भीतर माता पिता poms जैसे अन्य पोम फाइलों से <dependencyManagement> वर्गों का आयात की अनुमति देता है पर देख सकते हैं (किसी कारण से मेरे लिए काम नहीं)।
  • या xxx- सभी मॉड्यूल पर - एक मॉड्यूल जो समूह के भीतर अन्य सभी मॉड्यूल पर निर्भर करता है और इस प्रकार जब आप उस पर निर्भर करते हैं, तो आप दूसरों पर भी पारस्परिक रूप से निर्भर करते हैं।
+0

आपके उत्तर के लिए धन्यवाद। लेकिन सच्चाई यह है कि: हमारी कंपनी के पास 2000 जावा परियोजनाएं हैं (उनमें से प्रत्येक एक जार, युद्ध या कान बना रही है), उनमें से अधिकांश पुस्तकालयों (कुछ पुस्तकालयों का उपयोग कर कान या युद्ध हैं) हैं, और वे पहले से ही एक-दूसरे पर निर्भर हैं। ये निर्भरताएं "समूह" के अंदर हैं (जो वास्तव में विषयों पर आधारित हैं, लेकिन प्रत्येक एक जिम्मेदार व्यक्ति है), लेकिन वे कई अलग-अलग तरीकों से समूहों के बीच भी जाते हैं। –

+0

हम इस बड़े गाँठ को नहीं खोल सकते - हम इसे केवल प्रबंधित कर सकते हैं। यही कारण है कि हम एक समूह की परियोजनाओं को एक बहु-मॉड्यूल परियोजना में रखना चाहते हैं। फिर भी, विभिन्न बहु-मॉड्यूल परियोजनाओं में एक-दूसरे के बीच विभिन्न निर्भरताएं होंगी। –

+0

समूहों के बीच निर्भरता के पास किसी भी चक्र के अलावा पेड़ संरचना ठीक होनी चाहिए – caot