मावर स्कोप संकलन और JAR पैकेजिंग के लिए प्रदान किए गए के बीच अंतर


260

मावेन गुंजाइश के बीच अंतर क्या है compileऔर providedजब विरूपण साक्ष्य JAR के रूप में बनाया गया है? अगर यह वार होता, तो मैं समझता / समझती / नहीं कर पाती कि WEB-INF / lib में आर्टवर्क शामिल होगा या नहीं। लेकिन एक जार के मामले में यह कोई फर्क नहीं पड़ता - निर्भरता शामिल नहीं हैं। जब उनका दायरा compileया होता है तो उन्हें क्लासपाथ पर होना होता है provided। मुझे पता है कि providedनिर्भरताएं सकर्मक नहीं हैं - लेकिन क्या यह केवल एक अंतर है?

जवाबों:


289

से Maven डॉक्टर :

  • संकलन

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

  • प्रदान की

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

संक्षिप्त:

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

5
हाँ मैं जानता हूँ। लेकिन मैं JAR packagingसंदर्भ में scopes में अंतर के बारे में विचार करता हूं । मावेन डॉक इसके बारे में उल्लेख नहीं करता है। मैं थोड़ी देर के लिए मावेन का उपयोग करता हूं, लेकिन मैंने पहले से ही इसके बारे में खुद से पूछा है :) तो ऐसा लगता है कि JAR packagingसंदर्भ में, compileऔर provided(निर्भरता संक्रमण को छोड़कर) कोई अंतर नहीं है । क्या मैं सही हू?
इमॉल

3
@ जैकोब का अर्थ " सभी वर्गपथों में संकलन की गुंजाइश उपलब्ध है " है?
Geek

1
मुझे लगता है कि "Not Transitive" यहाँ बड़ी पकड़ है। क्योंकि निर्भरता नरक एक ऐसी चीज है जो डेवलपर्स बहुत बार सामना करते हैं और बशर्ते कि गुंजाइश इसे जाने से रोकती है और अन्य संस्करणों के साथ खिलवाड़ करना महत्वपूर्ण है।
सीतारमणी तम्र

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

1
@emstol अपने मूल प्रश्न पर वापस जा रहा है, आप सही हैं कि JAR के मामले में निर्भरता JAR के अंदर पैक नहीं की जाती है। लेकिन मावेन में, एक जार पैकेजिंग का मतलब है कि आप इसे एक पुस्तकालय के रूप में उपयोग करना चाहते हैं। जैसे ही आप इसे किसी अन्य मावेन परियोजना में आयात करते हैं सकर्मक निर्भरताएं लाएंगे यदि गुंजाइश है compileऔर यदि गुंजाइश है तो नहीं होगी provided
लियोउलज़

291

कंपाइल का मतलब है कि ऐप को कंपाइल करने और चलाने के लिए आपको JAR की आवश्यकता है। एक वेब अनुप्रयोग के लिए, एक उदाहरण के रूप में, JAR को WEB-INF / lib निर्देशिका में रखा जाएगा।

बशर्ते कि आपको संकलन के लिए JAR की आवश्यकता है, लेकिन समय के साथ पर्यावरण द्वारा पहले से ही एक JAR प्रदान किया जाता है, इसलिए आपको इसे अपने ऐप के साथ पैक करने की आवश्यकता नहीं है। एक वेब ऐप के लिए, इसका मतलब है कि JAR फाइल को WEB-INF / lib निर्देशिका में नहीं रखा जाएगा।

एक वेब ऐप के लिए, यदि ऐप सर्वर पहले से ही JAR (या इसकी कार्यक्षमता) प्रदान करता है, तो "प्रदान" का उपयोग करें अन्यथा "संकलन" का उपयोग करें।

यहाँ संदर्भ है।


11
आप ओपी के सवाल का जवाब नहीं दे रहे हैं? ' मावेन स्कोप के संकलन का उपयोग करने में क्या अंतर है और यह प्रदान किया जाता है जब आर्टवर्क को JAR के रूप में बनाया जाता है ? 'ध्यान दें कि लेखक स्पष्ट रूप से बताता है कि वे युद्ध के रूप में पैकेजिंग करते समय अंतर को जानते हैं।
अल्बर्टो

अगर मैं उसी एप्लिकेशन सर्वर पर तैनात एक और JAR का संदर्भ दे रहा हूं, तो क्या मैं इसका उपयोग कर सकता हूं ??
सामी उमर

1
तो स्पष्ट होने के लिए, एक प्रदत्त निर्भरता को क्लासपाथ में नहीं जोड़ा जाता है जब mvn exec:javaइसे चलाया जाता है, लेकिन एक संकलित निर्भरता है।
जेमी

मैंने यह सवाल पूछा - stackoverflow.com/questions/37360132/… इस समस्या को हल करने के लिए प्रदान की गई गुंजाइश से बदलकर किया गया था। लेकिन मुझे "प्रदत्त" गुंजाइश के साथ संकलित जार और "संकलित" गुंजाइश के साथ संकलित जार के बीच कोई अंतर नहीं दिखता है। क्या आप बता सकते हैं क्यों?
पावेल_के

पहला उत्तर पढ़ें: coderanch.com/t/502091/tools/difference-maven-compile-scope
NINCOMPOOP

22

यदि आप अपनी सभी निर्भरता (विशिष्ट xxxx-all.jar) के साथ एक एकल JAR फ़ाइल उत्पन्न करने की योजना बना रहे हैं, तो स्कोप मामलों को प्रदान किया जाता है, क्योंकि इस दायरे के अंदर की कक्षाएं परिणामी JAR में पैकेज नहीं होंगी।

अधिक जानकारी के लिए मावेन-असेंबली-प्लगइन देखें


7
प्रदान की निर्भरता ==> निर्भरता पैक नहीं किया जाएगा।
गाब

3
ओपी भ्रम स्पष्ट रूप से हल हो जाता है जब आप के साथ पैकेज करते हैं maven-assembly-plugin, दिलचस्प है कि सबसे ज्यादा मतदान वाले उत्तर इसका उल्लेख नहीं करते हैं।
हेनरिक जी।

मुझे यह उत्तर समझ में नहीं आता है। यह एक टिप्पणी की तरह लग रहा है।
रीइनियरियरपोस्ट

11
  • संकलन

वर्ग पथ में उपलब्ध कराएं, सामान्य जार होने पर इस निर्भरता को अंतिम जार में न जोड़ें; लेकिन इस जार को जार में जोड़ें अगर अंतिम जार एक एकल जार है (उदाहरण के लिए, निष्पादन योग्य जार)

  • प्रदान की

निर्भरता रन टाइम वातावरण में उपलब्ध होगी इसलिए किसी भी मामले में इस निर्भरता को न जोड़ें; यहां तक ​​कि एकल जार (यानी निष्पादन योग्य जार आदि) में भी नहीं


3

एक जार फ़ाइल के लिए, अंतर MANIFEST.MF फ़ाइल में जार में सूचीबद्ध classpath में है, अगर addClassPath को maven-jar-plugin कॉन्फ़िगरेशन में सही पर सेट किया गया है। 'संकलित' निर्भरताएँ प्रकट में दिखाई देंगी, 'बशर्ते' निर्भरताएँ न हों।

मेरे पालतू जानवरों में से एक यह है कि इन दो शब्दों में एक ही तनाव होना चाहिए। या तो संकलित और प्रदान किया गया, या संकलन और प्रदान करें।


0

जब आप providedमावेन की गुंजाइश निर्धारित करते हैं , तो इसका मतलब है कि जब प्लगइन चलता है, तो उपयोग की जाने वाली वास्तविक निर्भरता संस्करण आपके द्वारा स्थापित अपाचे मावेन के संस्करण पर निर्भर करेगा।


0

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

लेकिन अगर जार फ़ाइल अन्य पैकेज या एप्लिकेशन में उपयोग की जाती है, तो उसे जार फ़ाइल में सभी निर्भरता शामिल करने की आवश्यकता नहीं है क्योंकि ये पैकेज या एप्लिकेशन स्वयं अन्य निर्भरता प्रदान कर सकते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.