2016-04-26 9 views
7

मैं इस परिदृश्य, सरलीकृत है।मैं एक परियोजना की निर्भरताओं का उपयोग कैसे कर सकता हूं जिसे प्रदान किया गया है?</p> <pre><code>projectX ---> projectA ---> projectB </code></pre> <p>कहाँ <code>---></code> का अर्थ है "पर निर्भर करता है":

प्रोजेक्टबी वास्तव में सरल है। यह किसी भी निर्भरता की घोषणा नहीं करता है। वास्तव में, केवल प्रासंगिक हिस्सा यह है:

<packaging>jar</packaging> 

PROJECTA की pom.xml में मैं projectB निर्भरता घोषणा की है:

<packaging>jar</packaging> 
<dependencies> 
    <dependency> 
     <groupId>com.mycompany</groupId> 
     <artifactId>projectB</artifactId> 
     <version>1.0.0</version> 
     <scope>provided</scope> 
    </dependency> 
</dependencies> 

और projectX की pom.xml में मेरे पास है:

<packaging>war</packaging> 
<dependencies> 
    <dependency> 
     <groupId>com.mycompany</groupId> 
     <artifactId>projectA</artifactId> 
     <version>1.0.0</version> 
     <scope>compile</scope> 
    </dependency> 
</dependencies> 

समस्या projectX घटकों (वर्गों और इस तरह) है कि projectB में परिभाषित कर रहे हैं उपयोग करने के लिए की जरूरत है। यदि मैं प्रोजेक्ट ए में प्रोजेक्ट ए के लिए compile का उपयोग करने के लिए प्रोजेक्ट ए में स्कोप बदलता हूं, तो सब कुछ काम करेगा, लेकिन प्रोजेक्टएक्स में युद्ध उत्पन्न करते समय प्रोजेक्टबी को शामिल किया जाएगा, और मुझे इस लाइब्रेरी को जेनरेटेड युद्ध से बाहर करने की आवश्यकता है क्योंकि मैं प्रोजेक्ट बी को अन्य में प्रदान कर रहा हूं परियोजना का हिस्सा

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

प्रश्न: क्या कई जगहों पर निर्भरताओं को फिर से घोषित किए बिना इसे साफ तरीके से हासिल करने का कोई तरीका है?

+1

प्रदान की गई निर्भरताएं ट्रांजिटिव नहीं हैं http://stackoverflow.com/questions/34904558/why-arent-provided-maven- निर्भरता-transitive/। यह इस तरह मेवेन में बनाया गया है और यह संभवतः कभी नहीं बदलेगा। – Tunaki

+0

@ टुनकी जो इस प्रश्न के लिए प्रेरणा है (: –

+1

हाँ, लेकिन यह निष्कर्ष यहां है: * ऐसी निर्भरता का उपयोग करना गलत है जिसे आप घोषित नहीं करते हैं। * वहां मेरा जवाब देखें, इसके लिए एक बग रिपोर्ट है। आप ' आपको इसे स्पष्ट रूप से घोषित करना होगा। – Tunaki

उत्तर

6

समस्या यह है कि प्रोजेक्टएक्स को प्रोजेक्ट बी में परिभाषित घटकों (वर्गों और ऐसे) का उपयोग करने की आवश्यकता है।

फिर प्रोजेक्ट को वास्तव में प्रोजेक्टएक्स की निर्भरता होना चाहिए, provided गुंजाइश में। निर्भरता को दोबारा घोषित करने से यह बदल जाएगा कि कैसे मैवेन इसे पारस्परिक निर्भरता के रूप में संभालेगा (यानी, आप यह कहकर अपने व्यवहार को ओवरराइड कर सकते हैं: मैं इस परियोजना के साथ इस परियोजना में निर्भरता चाहता हूं)।

लेकिन फिर projectB जब projectX में युद्ध पैदा करने, और मैं उत्पन्न युद्ध

यह provided दायरे में फिर से की घोषणा के द्वारा नहीं होगा के बाहर इस पुस्तकालय की आवश्यकता है शामिल किया जाएगा। वैकल्पिक रूप से, आप compile को PROJECTA में ProjectB के दायरे को बदल सकता है और उसके बाद maven-war-plugin कॉन्फ़िगर उन्हें बाहर करने के लिए, inclusions/exclusions का उपयोग कर।
इसलिए हालांकि करने से पहले, आप डबल की जाँच करनी चाहिए क्यों शब्दार्थ (या आवश्यकताओं के लिहाज से) ProjectB PROJECTA में provided के रूप में स्थापित किया गया था और क्या अन्य उपभोक्ता परियोजनाओं पर इसके प्रभाव होगा।


अद्यतन
दोनों दृष्टिकोण से ऊपर आपकी आवश्यकताओं के अनुरूप कर सकते हैं।वैकल्पिक रूप से, के रूप में टिप्पणी में सुझाव दिया और विकल्प एक बेहतर प्रशासन और रखरखाव (केंद्रीकरण) की ओर अधिक स्थायी और लंबे समय में स्पष्ट हो सकता है:

  • उपयोग एक आम parent pom आप साझा निर्भरता की सूची जहां की घोषणा कर सकता है, वह यह है कि , निर्भरता जिनका उपयोग सभी बच्चों की परियोजनाओं द्वारा किया जाएगा, परिभाषित (और बनाए रखा) एक बार।
  • इस उत्तर के शीर्ष पर PROJECTA या ProjectB (विकल्प 1 के लिए इसी तरह बदले बिना कैसे Maven dependencies mediation PROJECTA पर सकर्मक निर्भरता को संभालने होगा बदलने के लिए,, the difference साथ है कि यह केवल लागू किया जाएगा जब भी निर्भरता में आता है ProjectX में dependencyManagement अनुभाग का उपयोग करें दायरा और अन्यथा अनदेखा)। इस प्रबंधन को केंद्रीकृत करने के लिए, फिर से, एक सामान्य माता-पिता (ऊपर विकल्प) में ऐसा करना बेहतर होगा।
संबंधित मुद्दे

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