2010-03-24 12 views
12

ठीक है, मैं सोचा मैं समझ गया Maven का उपयोग कैसे करें ...मैं एक मेवेन मॉड्यूल कैसे दूसरे पर निर्भर कर सकता हूं?

मैं एक मास्टर परियोजना M जो उप-परियोजनाओं A, B, और C है की है। C में कुछ सामान्य कार्यक्षमता (मुख्य रूप से इंटरफेस) शामिल हैं जिन्हें A और B द्वारा आवश्यक है। मैं प्रोजेक्ट रूट निर्देशिका (M निर्देशिका) से mvn compile jar:jar चला सकता हूं और JAR फ़ाइलें A.jar, B.jar, और C.jar प्राप्त कर सकता हूं। ताकि A और B सिर्फ एक संदर्भ सहित, इसलिए तरह से C संदर्भित कर सकते हैं, (इन सभी कलाकृतियों के लिए संस्करण वर्तमान में 2.0-SNAPSHOT कर रहे हैं।)

M निर्देशिका सूचियों C अपने <dependencyManagement> टैग के तहत में मास्टर pom.xml फ़ाइल:

<dependency> 
    <groupId>my.project</groupId> 
    <artifactId>C</artifactId> 
</dependency> 

अभी तक, बहुत अच्छा है। मैं कमांड लाइन से mvn compile चला सकता हूं और सब कुछ ठीक काम करता है। लेकिन जब मैं नेटबीन में प्रोजेक्ट खोलता हूं, तो यह समस्या से शिकायत करता है: "कुछ निर्भरता कलाकृतियों स्थानीय भंडार में नहीं हैं", और यह कहता है कि गायब आर्टिफैक्ट C है। इसी प्रकार कमांड लाइन से, यदि मैं A या B निर्देशिका में बदलता हूं और mvn compile चलाने की कोशिश करता हूं तो मुझे "बिल्ड त्रुटि: आर्टिफैक्ट को हल करने में विफल" मिलता है।

मैं मैं मैन्युअल रूप से जहाँ मेरे C.jar बनाया गया था करने के लिए जाने के लिए और mvn install:install-file चला सकते हैं उम्मीद है, लेकिन मैं नहीं बल्कि एक समाधान है कि मुझे बस NetBeans (और/या m2eclipse का उपयोग कर ग्रहण में) में सीधे काम करने के लिए सक्षम बनाता है पाते हैं।

मैं क्या गलत कर रहा हूं?

उत्तर

22

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

साइड नोट: यदि आप mvn compile jar:jar आह्वान लेकिन पसंद करते हैं mvn package नहीं करना चाहिए।सबसे पहले, package चरण चलाना package (compile सहित) और package से पहले सभी चरणों को ट्रिगर करेगा। दूसरा, प्रोजेक्ट के <packaging> मूल्य के आधार पर packagejar:jar, या war:war इत्यादि चलाएगा (इस पर अधिक जानकारी के लिए introduction to the lifecycle देखें)। यह मेवेन की बड़ी ताकत है: आपको यह जानने की जरूरत नहीं है कि परियोजना एक जार, एक युद्ध, एक ईजेबी, आदि है और इसे पैकेज करने के लिए उचित लक्ष्य चलाने के लिए। बस मानकीकृत package चरण चलाएं और मेवेन नौकरी करेगा (डिफ़ॉल्ट लक्ष्य बाइंडिंग का उपयोग करके)।

वह मेवेन सैद्धांतिक भाग के लिए था। आईडीई के अंदर, मैवेन के साथ काम करने के लिए चीजें थोड़ा अलग हो सकती हैं। आईडीई प्रोजेक्ट निर्भरता (यानी आईडीई के अंदर कोड पर निर्भरता) बाइनरी निर्भरताओं के बजाय उपयोग कर सकते हैं ताकि एक परियोजना में किए गए परिवर्तन mvn install चलाने के बिना अन्य मॉड्यूल में दिखाई दे सकें। यह ग्रहण + एम 2 ग्रहण का मामला है। और यह निम्नलिखित शर्त के तहत NetBeans करने के लिए भी लागू होता है (Dependency Management देखें):

Hint: If you open a project that other projects depend on, the icon in other projects changes to a "maven project" icon to denote that the IDE knows about link between the projects. However such a link is only established when the groupId, artifactId and version all match in the dependency and project declaration. Frequently occurring problem is that you change an API signature in your library project, but the application is not picking up. Often it's caused by the fact that the application is using an older version of the library artifact. The artifact icon can help you track down these problems.

+0

धन्यवाद। मुझे पता था कि 'एमवीएन संकलन' के बजाय 'एमवीएन पैकेज' का उपयोग करने के बारे में, लेकिन अनुस्मारक के लिए धन्यवाद। हालांकि, wiki.netbeans.org पर "मेवेन बेस्ट प्रैक्टिस" लिंक विशेष रूप से उपयोगी था, इसलिए मैं इस उत्तर को स्वीकार करने के रूप में चिह्नित कर रहा हूं। –

+0

@ डैनियल आपका स्वागत है। लेकिन साइड नोट 'एमवीएन पैकेज' बनाम 'एमवीएन जार: जार' के बारे में अधिक था :) खुशी है कि आपने लिंक को उपयोगी पाया है। –

+0

क्या माता-पिता के 'compile' के हिस्से के रूप में मॉड्यूल के' इंस्टॉल' को चलाने के लिए संभव है? –

6

आपको mvn compile के बजाय mvn install चलाने की आवश्यकता है। install लक्ष्य संकलित और पैकेजिंग के बाद निर्मित जार को स्थानीय भंडार में कॉपी करेगा। यदि आप केवल संकलन चलाते हैं, तो यह केवल क्लास फ़ाइलों को target निर्देशिका में संकलित करेगा और उन्हें अन्य परियोजनाओं के लिए उपलब्ध नहीं कराएगा।

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

3

नेटबीन स्थानीय भंडार सामग्री द्वारा परियोजनाओं को एक साथ जोड़ता है, इसलिए अधिकांश परिदृश्यों में एमवीएन इंस्टॉल आवश्यक है।

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

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