2010-03-31 12 views
11

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

(ये निर्भरता वास्तव में चोट नहीं है, लेकिन वे अपने वास्तविक मॉड्यूल संरचना अस्पष्ट हो सकता है और पोम में कम सामान होने आमतौर पर बेहतर

उत्तर

12
कुछ हद तक आप dependency:analyze उपयोग कर सकते हैं करने के लिए

है। :-), लेकिन यह भी नहीं है उपयोगी। JBoss Tattletale भी देखें।

कुछ समय पहले मैंने पोम्स का गहराई से विश्लेषण करने में सक्षम होने के लिए maven-storyteller-plugin शुरू किया है, लेकिन परियोजना उत्पादन/सार्वजनिक उपयोग से बहुत दूर है। अप्रयुक्त/अनावश्यक निर्भरताओं का विश्लेषण करने के लिए आप storyteller:recount लक्ष्य का उपयोग कर सकते हैं।

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

अद्यतन नवंबर 2014

मैं सिर्फ moved my old code of the Storyteller plugin to GitHub है। मैं इसे रीफ्रेश कर दूंगा और केंद्रीय को छोड़ दूंगा ताकि यह दूसरों के लिए उपयोग योग्य हो।

+0

+1 जोड़ने के लिए कुछ नहीं। –

1

आप एक है जब -> बी, बी -> सी, और फिर ऐसा है कि एक refactor -> (बी, सी)यदि यह मामला है कि एक अभी भी बी के खिलाफ संकलित है, बहुत बहुत नहीं बस निर्भरता को लेने के लिए, क्योंकि आप इसे संक्रामक प्राप्त करना चाहते हैं।

मामले के बारे में सोचें जब ए -> (बी-1.0, सी-1.0), बी-1.0 -> सी-1.0। सबकुछ सिंक हो रहा है, इसलिए सीसे की निर्भरता से "डुप्लिकेशंस" से बचने के लिए। फिर आप बी-2.0 -> सी-2.0 का उपयोग करने के लिए ए को अपग्रेड करते हैं। आप त्रुटियों को देखना शुरू करते हैं क्योंकि सी-1.0 कक्षाएं मिलीं लेकिन सी-2.0 कक्षाएं मिलीं। इस परिदृश्य में जल्दी से सुलझाने योग्य होने पर, यह बहुत कम है जब आपके पास बहुत निर्भरताएं हैं।

आप बहुत ज्यादा एक के पोम कि का कहना है कि यह स्पष्ट रूप से सी-1.0 classpath पर को खोजने के लिए इतना है कि आप आप सकर्मक निर्भरता संघर्ष है जब समझ सकते हैं उम्मीद में जानकारी चाहते हैं। दोबारा, मेवेन यह सुनिश्चित करने का काम करेगा कि किसी विशेष जार का "निकटतम" संस्करण आपके क्लासपाथ पर समाप्त होता है। लेकिन जब चीजें गलत होती हैं - आप सभी निर्भरता मेटाडेटा चाहते हैं जो आप प्राप्त कर सकते हैं।

थोड़ा और व्यावहारिक नोट पर, जब आप इसे अपने पोम से हटा सकते हैं और आपकी सभी यूनिट/एकीकरण/स्वीकृति परीक्षण अभी भी पास हो जाते हैं तो निर्भरता अप्रयुक्त होती है।;-)

+1

> ... एक निर्भरता अप्रयुक्त है जब आप इसे अपने पोम > से हटा सकते हैं और आपकी सभी इकाई/एकीकरण/स्वीकृति परीक्षण अभी भी पास हो जाते हैं ... यह सही है, लेकिन विश्लेषण के लिए कोई विधि नहीं देता है। :) – lexicore

2

मैं

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

कोई सुनहरा नियम, बस कुछ बुनियादी युक्तियाँ है:

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

आपको निर्भरताओं के नाम से अनुमान लगाने की आवश्यकता है कि आपको क्या बाहर करना होगा, सर्वोत्तम उदाहरण पार्सर्स, ट्रांसफार्मर, दस्तावेज़बिल्डर: xalan, xerces, xalan alfred और co। उन्हें हटाने का प्रयास करें और आंतरिक jdk1.6 पार्सर, सामान्य अपाचे सामग्री का उपयोग करें, log4j भी देखने लायक है।

नज़र भी नियमित रूप से lib वितरण में आप अलग अलग संस्करण के साथ डुप्लिकेट पुस्तकालयों (Maven की निर्भरता समाधानकर्ता कि बचना चाहिए)

जाने नीचे से ऊपर, अपने सामान्य मॉड्यूल के साथ शुरू करते हैं, तो सेवा तक ऊपर जाना नहीं है, तो परत, प्रत्येक मॉड्यूल में निर्भरता को कम करने, मॉड्यूल कान/युद्ध में शुरू करने की कोशिश न करें, यह बहुत कठिन होगा

जांचें या तुलना करने और नए के साथ पुरानी डिलीवरी योग्य होने पर, यदि आपका डिलिवरेबल अभी भी काम कर रहा है, तो अक्सर जांच करें (खासकर वेब-इंफ/lib निर्देशिका में जो Winmerge/beyoncompare के साथ गायब हो गया है)

+0

यदि कोई इस पर ठोकर खाता है - थोड़ा और विस्तृत और अद्यतन निर्देश यहां हैं http://stackoverflow.com/questions/33907162/systematic-approach-with-maven-to-deal-with- निर्भरता-hell –

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