2009-05-19 15 views
16

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

वहाँ एक "सबसे अच्छा अभ्यास" के लिए

  • कैसे पहचान भागों है कि तुरंत अलग किया जा सकता
  • दस्तावेज़ अंतर-निर्भरता की रास्ता है नेत्रहीन
  • मौजूदा कोड सुलझाना
  • संभाल "पैच" हमें पुस्तकालयों पर लागू करने की आवश्यकता है (वर्तमान में उन्हें वास्तविक पुस्तकालय से पहले कक्षा में डालकर संभाला जाता है)

यदि इसका समर्थन करने के लिए (फ्री/ओपन) टूल्स हैं, तो मैं पॉइंटर्स की सराहना करता हूं।

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

संपादित 2009-07-10

हम बाहर बंटवारे Apache Ant/Ivy का उपयोग कर कुछ कोर मॉड्यूल की प्रक्रिया में हैं। वास्तव में सहायक और अच्छी तरह से डिज़ाइन किया गया टूल, मैवेन के रूप में आपके ऊपर उतना ही लागू नहीं करता है।

मैं कुछ और अधिक सामान्य विवरण और हम उस क्यों कर रहे हैं अपने ब्लॉग पर के बारे में व्यक्तिगत राय नीचे लिखा - बहुत यहाँ पोस्ट करने के लिए लंबे समय तक और शायद हर किसी के लिए दिलचस्प नहीं है, तो आपके स्वयं के विवेक पर का पालन करें: www.danielschneller.com

+0

ठीक है, अब आप किस निर्माण प्रणाली का उपयोग कर रहे हैं? यदि यह एक चींटी/मेवेन तुलना है तो यह किसी और चीज की तुलना में धार्मिक पसंद की तरह दिखता है। –

+0

वर्तमान में हम सभी प्रकार के कलाकृतियों को उत्पन्न करने के लिए जटिल स्क्रिप्ट के सेट के साथ चींटी का उपयोग कर रहे हैं।लेकिन यह कभी भी "धर्म" का मुद्दा नहीं रहा है - यह कई साल पहले बिना किसी तुलना के निर्णय लिया गया था। पीछे तो चीजें बिल्कुल छोटी थीं। –

+0

मेरा मतलब यह था कि अंतर उतना बड़ा नहीं है जितना कि कुछ ऐसा करने के लिए ऐसा करेंगे, इसलिए मैवेन को सब कुछ आसान बनाने के लिए स्विच करने की अपेक्षा न करें। –

उत्तर

8

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

ओएसजीआई द्वारा प्रदान की गई तंत्र आपको मौजूदा कोड को उलझाने में मदद करेगी। क्लासलोडिंग के तरीके के कारण, यह पैच को एक आसान तरीके से संभालने में भी आपकी सहायता करता है।

Some concepts of OSGi that seem to be a good match for you, as shown from wikipedia:

ढांचे धारणात्मक निम्नलिखित क्षेत्रों में विभाजित है:

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

मैंने पहले से ही एक अलग परियोजना के लिए ओएसजीआई का उपयोग किया है, लेकिन शुरुआत से ही। लंबे समय तक यह संभवतः जिस तरह से मैं जाने की कोशिश करूंगा। हालांकि ओएसजीआई फ्रेमवर्क में रनटाइम को बदलना इस परिमाण के ऐप के साथ आसानी से कुछ नहीं किया जाता है। हालांकि आवश्यक कदम उठाने (MANIFEST.MF) निश्चित रूप से कुछ है जो कम लागत पर मूल्य जोड़ता है। –

0

मैं wouldn एक विरासत स्रोत कोड आधार के लिए मेवेन की सिफारिश नहीं करते हैं। यह आपको इसके साथ काम करने के लिए सब कुछ अनुकूलित करने की कोशिश कर कई सिरदर्द दे सकता है।

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

6

पहला: शुभकामनाएं अच्छी कॉफी। आपको दोनों की आवश्यकता होगी।

मुझे एक बार एक समान समस्या थी। भयानक परिपत्र निर्भरताओं के साथ विरासत कोड, org.example.pkg1.A जैसे विभिन्न संकुलों के वर्गों के बीच भी org.example.pk2.B और पर निर्भर करता है।

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

तो मैंने धीरे-धीरे परतों के माध्यम से काम किया। maven2 निर्भरताओं को संभाला और m2eclipse प्लगइन एक सहायक निर्भरता दृश्य प्रदान किया। बीटीडब्लू - आमतौर पर एक ग्रहण परियोजना को एक मैवेन प्रोजेक्ट में परिवर्तित करना मुश्किल नहीं होता है। m2eclipse यह आपके लिए कर सकता है और आपको बस कुछ नए फ़ोल्डर्स (जैसे src/main/java) बनाना होगा और स्रोत फ़ोल्डर के लिए बिल्ड पथ समायोजित करना होगा। बस एक या दो मिनट लेता है। लेकिन अधिक कठिनाइयों की अपेक्षा करें, अगर आपकी परियोजना एक ग्रहण प्लगइन या आरसीपी एप्लीकेशन है और आप न केवल कलाकृतियों का प्रबंधन करने के लिए बल्कि आवेदन बनाने और तैनात करने के लिए मेवेन चाहते हैं।

राय, ग्रहण, मेवेन और नेक्सस (या कोई अन्य मैवेन रिपोजिटरी मैनेजर) शुरू करने के लिए एक अच्छा आधार है। यदि आप सिस्टम आर्किटेक्चर और इस वास्तुकला वास्तव में कार्यान्वित किया जाता है का एक अच्छा दस्तावेज आप भाग्यशाली हैं;)

3

मैं एक छोटे से कोड बेस (40 kloc) में एक समान अनुभव था।कोई ° नियम नहीं हैं ":

  • एक बिना और साथ संकलित" मॉड्यूल अन्य निर्भरता
  • मैं चक्रीय संभाला बिना पत्ता मॉड्यूल ", मॉड्यूल" आदेश में यह देखने के लिए उपयोग
  • मैं से शुरू कर दिया है " निर्भरता (यह एक बहुत ही त्रुटि भरा कार्य है)
  • Maven साथ प्रलेखन (रिपोर्ट) के साथ एक बड़ा सौदा है कि वहाँ Maven आप हमेशा देख सकते हैं कि क्या दोनों का उपयोग करता है के साथ
  • अपने सीआई प्रक्रिया में तैनात किया जा सकता साइट दोनों NetBeans (एक
    बहुत अच्छा निर्देशित ग्राफ के साथ)
  • Maven के साथ आप अपने codebase में पुस्तकालय कोड आयात कर सकते हैं, स्रोत पैच लागू करते हैं और अपने उत्पादों के साथ संकलन में
  • (कभी कभी यह बहुत आसान है, कभी कभी यह बहुत मुश्किल है)
भी

चेक निर्भरता विश्लेषक: http://www.javalobby.org/servlet/JiveServlet/download/17-96956-92153685-7907/screenshot.jpg

Netbeans:

http://dm.zimmer428.net/wp-content/uploads/2009/02/67pre-dependency-graph.jpg

1

मैवेन मौजूदा सिस्टम के लिए माइग्रेट करने के लिए दर्दनाक है। हालांकि यह बिना किसी कठिनाई के 100+ मॉड्यूल परियोजनाओं का सामना कर सकता है।

1

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

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

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

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

0

यह नि: शुल्क नहीं है लेकिन Structure101 आपको उतना अच्छा देगा जितना आप अपने सभी बुलेट पॉइंट्स को मारने के लिए टूल सपोर्ट के मामले में प्राप्त करेंगे। लेकिन रिकॉर्ड के लिए मैं पक्षपातपूर्ण हूं, इसलिए आप सोनारजे और लैटिक्स को भी देखना चाहेंगे .-)

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