2012-02-21 18 views
22

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

अब, मैं अपनी परियोजना में लाइब्रेरी का उपयोग करने की कोशिश कर रहा हूं। जब मैंने लाइब्रेरी संकलित की, तो मैंने पाया कि target नामक फ़ोल्डर को लाइब्रेरी फ़ोल्डर में बनाया गया था और उस फ़ोल्डर के अंदर, classes नामक एक और फ़ोल्डर था। मैंने classes फ़ोल्डर को अपने क्लासपाथ में जोड़ा। हालांकि, जब भी मैं अपनी परियोजना में उस लाइब्रेरी का उपयोग करने की कोशिश करता हूं जो मैवेन का उपयोग नहीं करता है, तो यह कहता है कि यह पुस्तकालय की निर्भरताओं को नहीं ढूंढ सकता है।

मैं अपने क्लासपाथ में उस पुस्तकालय की निर्भरताओं को कैसे जोड़ूं?
क्या मुझे सभी लाइब्रेरी की निर्भरताओं को मैन्युअल रूप से डाउनलोड करने और क्लासपाथ में जोड़ने की आवश्यकता है?
क्या कोई तरीका है कि मैवेन मेरे लिए ऐसा कर सकता है?
मुझे ऐसा करने की क्या ज़रूरत है ताकि मैं अपनी परियोजना में लाइब्रेरी का उपयोग कर सकूं?

मेरी परियोजना लाइब्रेरी की तुलना में पूरी तरह से अलग निर्देशिका में है। अभी, मेरी प्रोजेक्ट लाइब्रेरी फ़ाइलों को सही तरीके से लोड करने में सक्षम है, लेकिन लाइब्रेरी निर्भरता नहीं।

+4

+1, मेवेन न्यूबीज के लिए बहुत महत्वपूर्ण प्रश्न का उपयोग कर सकते हैं। –

उत्तर

14

जब आपने उस लाइब्रेरी के लिए mvn install निष्पादित किया था, तो उसे एक जार फ़ाइल बनाना चाहिए था और इसे target/libaryname-version.jar पर रखना चाहिए था। classes फ़ोल्डर की सामग्री के बजाय इस अंतिम जार पर निर्भर होना बेहतर होगा। मेवेन के पास एक परियोजना की सभी निर्भरताओं को डाउनलोड करने का लक्ष्य भी है। आप

mvn dependency:copy-dependencies 

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

mvn dependency:copy-dependencies -DincludeScope=runtime 
+2

कूल हैक!यह मेरे लिए काम किया, लेकिन मेरी जरूरत से थोड़ा अलग था। मेरे मामले में, यह classpath प्राप्त करने के लिए पर्याप्त था। आप संसाधनों में कुछ फ़ाइल है, जो आपको बाद में उपयोग कर सकते हैं करने के लिए classpath और यह उत्पादन उत्पन्न कर सकते हैं। कोड यहाँ ' \t \t \t \t org.apache.maven.plugins है \t \t \t \t Maven-निर्भरता-प्लगइन \t \t \t \t उत्पन्न-स्रोतों निर्माण classpath<विन्यास> \t \t \t $ {project.basedir}/src/मुख्य/resourc es/classpath ' – raxith

+0

प्रस्तुत @raxith इस अपने स्वयं के जवाब के रूप में, कोड खंड भी व्याख्या करने के लिए लंबा है। परियोजना फ़ोल्डर से com.myCompany.App'; –

+0

@ Jörn Horstmann तो कॉपी-निर्भरता लक्ष्य चलाने के बाद, कोड हम 'जावा -cp पर अमल करने के लिए है चलाने के लिए" लक्ष्य \ निर्भरता \ * लक्ष्य \ * "? –

4

ठीक है, यहां काम पर कुछ समस्याएं हैं। मेवेन आपके पुस्तकालय के निर्माण और डाउनलोड करने के लिए आवश्यक सभी निर्भरताओं को समझने का कड़ी मेहनत करता है। ये निर्भरता आपके मैवेन रिपोजिटरी (<user home>/.m2/repository) में स्थानीय रूप से संग्रहीत होती है, लेकिन जब तक उन्हें असेंबली के हिस्से के रूप में आवश्यक न हो, तो आप उन्हें target फ़ोल्डर में नहीं ढूंढ पाएंगे। कम से कम, डिफ़ॉल्ट रूप से नहीं।

<project> 
... 
    <profiles> 
     <profile> 
      <id>qa</id> 
      <build> 
       <plugins> 
        <plugin> 
         <artifactId>maven-dependency-plugin</artifactId> 
          <executions> 
           <execution> 
            <phase>install</phase> 
            <goals> 
             <goal>copy-dependencies</goal> 
            </goals> 
            <configuration> 
             <outputDirectory>${project.build.directory}/lib</outputDirectory> 
            </configuration> 
           </execution> 
          </executions> 
        </plugin> 
       </plugins> 
      </build> 
     </profile> 
    </profiles> 
</project> 
आप ऊपर दिखाए गए पोम परिवर्तनों के साथ

अब सभी जार प्राप्त करने के लिए सक्षम होना चाहिए: क्या आप पहली बार करने की जरूरत है (इस पोम अंश another SO post से cribbed गया था) का निर्माण फ़ोल्डर में सभी निर्भरता स्टोर करने के लिए Maven मिलता है आपकी लाइब्रेरी द्वारा निर्भर निर्भरताएं और उन्हें अपने कक्षा में शामिल करें (target/lib से)। मैं उन्हें आपके वर्कस्टेशन पर किसी अन्य फ़ोल्डर में कॉपी करने की अनुशंसा करता हूं, क्योंकि target फ़ोल्डर को हर बार जब आप clean लाइब्रेरी मेवेन बिल्ड के लिए निष्पादित करते हैं तो उसे नियुक्त किया जाएगा।

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

किसी भी मामले में, आपके द्वारा चुने गए दो दृष्टिकोणों के साथ शुभकामनाएं।

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