पोम xml में निर्भरता और प्लगइन टैग के बीच मावेन में क्या अंतर है?


118

मैं मावेन टूल में नया हूं, मैंने स्प्रिंग और हाइबरनेट के साथ एक प्रोजेक्ट बनाया है और उन्हें प्लगइन्स के रूप में pom.xml में कॉन्फ़िगर किया गया है, लेकिन JUnit को निर्भरता के तहत टैग किया गया है। मेरा सवाल यह है कि एक प्लगइन के रूप में एक के पीछे तर्क क्या है और एक निर्भरता के रूप में?

जवाबों:


213

प्लगइन्स और निर्भरता दोनों जार फाइलें हैं।

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

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

वही अपने परिदृश्य के साथ जाता है। आपको कुछ स्प्रिंग एक्ज़िक्युटेबल्स को निष्पादित करने के लिए स्प्रिंग-प्लगइन का उपयोग करना होगा [मुझे यकीन नहीं है कि स्प्रिंग-प्लगइन्स का उपयोग किस लिए किया जाता है। मैं यहां केवल एक अनुमान लगा रहा हूं]। लेकिन आपको उन निष्पादनयोग्य को निष्पादित करने के लिए निर्भरता की आवश्यकता है। और जुनिट को निर्भरता के तहत टैग किया गया है क्योंकि इसका उपयोग यूनिट-परीक्षणों को निष्पादित करने के लिए अचूक-प्लगइन द्वारा किया जाता है।

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

उम्मीद है कि यह आपके सवाल का जवाब देता है!


क्या कोई मुझे बता सकता है कि निष्पादन में चरण और लक्ष्य के बीच क्या अंतर है ?? जैसा कि मुझे पता था कि चरण मावेन के जीवन चक्र के बारे में बात कर रहा है .. लेकिन फिर से लक्ष्य क्यों? कोई संकेत? कभी-कभी मैं लोगों को लक्ष्य पर जीवन चक्र कीवर्ड डालते हुए देखता हूं ... ??? (??)
taymedee

@ तय्येमी इस SO प्रश्न में अंतर का वर्णन है: stackoverflow.com/questions/16205778/…
dev_feed

1
@ r981 आपका उत्तर अधिक स्पष्ट होना चाहिए। यह उत्तर बेहतर है: stackoverflow.com/questions/26292073/…
Digital Impermanence

मुझे लगता है कि इस उत्तर का मिस्ड पॉइंट यह है: टॉप-लेवल की निर्भरता मुख्य रूप से प्लगइन्स के बजाय आपकी कलाकृतियों द्वारा उपयोग की जाती है।
lfree

3
@MichaelPacheco, मेरा मतलब क्या था, स्प्रिंग-प्लगइन कोड के एक सेट को निष्पादित करने का एक निश्चित कार्य करेगा, जो कुछ पुस्तकालयों पर निर्भर हो सकता है, जो कि 'निर्भरता' द्वारा निर्दिष्ट किया जाएगा। एक अलग उदाहरण लें: आपको कोड के एक टुकड़े को निष्पादित करने के लिए एक कंपाइलर की आवश्यकता होती है; यहां, आपका संकलक एक प्लगइन है और आपका कोड निष्पादन योग्य है। आपका कंपाइलर अकेले किसी भी कोड को निष्पादित करने में सक्षम है, लेकिन आपका कोड किसी लाइब्रेरी पर निर्भर हो सकता है, अपाचे कॉमन्स कहें, जो एक निर्भरता होगी। आपका कंपाइलर केवल उस कोड को संकलित कर सकता है जब क्लासपाथ में निर्भरताएं मौजूद हों। मुझे उम्मीद है कि अब यह स्पष्ट है।
r9891

37

मावेन को ही खाद्य प्रोसेसर के रूप में वर्णित किया जा सकता है जिसमें कई अलग-अलग इकाइयाँ हैं जिनका उपयोग विभिन्न कार्यों को पूरा करने के लिए किया जा सकता है। उन इकाइयों को प्लगइन्स कहा जाता है। उदाहरण के लिए, अपने प्रोजेक्ट मावेन के उपयोग को संकलित करने के लिए, maven-compiler-pluginपरीक्षण चलाने के लिए - maven-surefire-pluginऔर इसी तरह।

मावेन के संदर्भ में निर्भरता वर्गों का एक पैकेज्ड टुकड़ा है जो आपकी परियोजना पर निर्भर करता है। यह युद्ध, युद्ध आदि हो सकता है। उदाहरण के लिए, यदि आप JUnit परीक्षण लिखना चाहते हैं, तो आपको JUnit एनोटेशन और कक्षाओं का उपयोग करना होगा, इस प्रकार आपको यह घोषित करना होगा कि आपकी परियोजना JUnit पर निर्भर करती है।


त्वरित उत्तर के लिए धन्यवाद, क्षमा करें, लेकिन फिर भी मैं उलझन में हूं क्योंकि मैं जानता हूं कि जुनिट भी एक ढांचा है और (हाइबरनेट, स्प्रिंग) भी केवल ढांचे के तहत आता है, तो इसका मतलब है कि मामलों में (हाइबरनेट, वसंत) भी निर्भरता टैग में कॉन्फ़िगर किया जा सकता है ? मुझे आशा है कि आपको मेरा सवाल मिल गया होगा
कोरल

हां, और जहां तक ​​मुझे पता है कि स्प्रिंग मावेन प्लगइन जैसी कोई चीज नहीं है। आमतौर पर, स्प्रिंग लिबास (या हाइबरनेट, या JUnit, या TestNG आदि) को आपकी परियोजना के लिए निर्भरता के रूप में घोषित किया जाता है। यदि आप maven के लिए नए हैं मैं पढ़ने के लिए सलाह देते हैं इस बहुत अच्छी किताब।
एंड्रयू लॉगविनोव

@AndrewLogvinov - मेरे पास एपीआई स्वचालन परीक्षण के लिए एक बहु pom परियोजना है। मावेन परियोजनाओं में से एक में स्वचालन परीक्षण हैं। प्रोजेक्ट पोम के निर्माण खंड में केवल 1 प्लगइन था - एक सुइट के संदर्भ में मावेन अचूक प्लगइन। संपूर्ण बिल्ड टैग हटा दिया गया था। क्या आप मुझे बता सकते हैं कि इसका क्या मतलब है? धन्यवाद।
मास्टरजोए

15

प्लगइन्स और निर्भरता बहुत अलग चीजें हैं और ये पूरक हैं।

क्या प्लगइन्स हैं?

प्लगइन्स एक मावेन बिल्ड के लिए कार्य करते हैं। ये एप्लिकेशन में पैक नहीं किए गए हैं।

ये मावेन के दिल हैं।
मावेन द्वारा निष्पादित किसी भी कार्य को प्लगइन्स द्वारा निष्पादित किया जाता है
: वहाँ प्लग इन की दो श्रेणियां हैं और प्लग-इन :buildreporting

  • बिल्ड प्लगइन्स को बिल्ड के दौरान निष्पादित किया जाएगा और उन्हें <build/>पोम से तत्व में कॉन्फ़िगर किया जाना चाहिए ।
  • साइट प्लगइन्स के दौरान रिपोर्टिंग प्लगइन्स निष्पादित किए जाएंगे और उन्हें <reporting/POM से तत्व में कॉन्फ़िगर किया जाना चाहिए ।

कमांड लाइन (उदाहरण के लिए mvn clean, mvn clean packageया mvn site) में निर्दिष्ट मावेन लक्ष्य के अनुसार , एक विशिष्ट जीवन शैली का उपयोग किया जाएगा और प्लगइन्स लक्ष्यों के एक विशिष्ट सेट को निष्पादित किया जाएगा।
वहाँ तीन में निर्मित निर्माण lifecycles हैं: default, cleanऔर sitedefaultजीवन चक्र अपनी परियोजना तैनाती संभालती है, cleanजीवन चक्र हैंडल सफाई परियोजना है, जबकि siteजीवन चक्र हैंडल अपने प्रोजेक्ट की साइट प्रलेखन का निर्माण।

एक प्लगइन लक्ष्य एक विशिष्ट जीवन शैली के एक विशिष्ट चरण के लिए बाध्य हो सकता है।
उदाहरण के लिए जीवनचक्र चरण maven-compiler-pluginमें compileलक्ष्य को डिफ़ॉल्ट रूप से बांधता है compile:।
अधिकांश मावेन प्लगइन्स (दोनों कोर प्लगइन्स और थर्ड पार्टी प्लगइन्स) कॉन्फ़िगरेशन पर पक्ष सम्मेलन करते हैं। इसलिए ये आम तौर पर अपने उपयोग को सरल बनाने के लिए एक विशिष्ट चरण के लिए एक प्लगइन लक्ष्य को बाध्य करते हैं।

यह शून्य और कम त्रुटि प्रवण है:

<plugin>
  <artifactId>maven-compiler-plugin</artifactId>
  <version>3.7.0</version>
</plugin>

से अधिक:

<plugin>
  <artifactId>maven-compiler-plugin</artifactId>
  <version>3.7.0</version>
  <executions>
    <execution>
        <phase>compile</phase>
        <goals>
            <goal>compile</goal>
        </goals>
    </execution>
  </executions>
</plugin>

निर्भरता क्या हैं?

निर्भरताएं मावेन बिल्ड के दौरान क्लासपाथ में आवश्यक मावेन कलाकृतियां / घटक हैं।
इन्हें एप्लिकेशन में पैक किया जा सकता है लेकिन आवश्यक नहीं ( scopeनीचे देखें)।

अधिकांश निर्भरताएं जार हैं लेकिन ये अन्य प्रकार के अभिलेखागार भी हो सकते हैं: युद्ध, कान, परीक्षण-जार, ईजेबी-क्लाइंट ... या अभी भी पोम या बीओएम।
Pom.xml में, कई स्थानों पर निर्भरताएं निर्दिष्ट की जा सकती हैं: <build><dependencies>भाग, dependencies managementभाग या अभी भी एक pluginघोषणा में ! वास्तव में कुछ प्लगइन्स को उनके निष्पादन के दौरान क्लासपाथ में कुछ निर्भरताएं रखने की आवश्यकता हो सकती है। यह आम नहीं है लेकिन ऐसा हो सकता है।
यहाँ प्रलेखन से एक उदाहरण है जो दिखाता है कि pluginऔर dependencyएक साथ काम कर सकते हैं:

उदाहरण के लिए, मावेन एंट्रॉन प्लगिन संस्करण 1.2 चींटी संस्करण 1.6.5 का उपयोग करता है, यदि आप इस प्लगइन को चलाते समय नवीनतम चींटी संस्करण का उपयोग करना चाहते हैं, तो आपको <dependencies>निम्नलिखित जैसे तत्व जोड़ना होगा :

<project>
  ...
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-antrun-plugin</artifactId>
        <version>1.2</version>
        ...
        <dependencies>
          <dependency>
            <groupId>org.apache.ant</groupId>
            <artifactId>ant</artifactId>
            <version>1.7.1</version>
          </dependency>
          <dependency>
            <groupId>org.apache.ant</groupId>
            <artifactId>ant-launcher</artifactId>
            <version>1.7.1</version>
          </dependency>
         </dependencies>
      </plugin>
    </plugins>
  </build>
  ...
</project>

मावेन में, निर्भरताएँ एक विशिष्ट प्रारूप में संदर्भित की जाती हैं
groupId:artifactId:packaging:classifier:version:।
क्लासिफ़ायर (जो वैकल्पिक है) और पैकेजिंग ( JARडिफ़ॉल्ट रूप से) आमतौर पर निर्दिष्ट नहीं होती हैं। तो में आम प्रारूप dependencyघोषणा नहीं बल्कि यह है: groupId:artifactId:version
यहाँ <build><dependencies>भाग में घोषित निर्भरता का एक उदाहरण दिया गया है :

<build>
   <dependencies>
      <dependency>
         <groupId>org.hibernate</groupId>
         <artifactId>hibernate-core</artifactId>
         <version>5.2.14.Final</version>
      </dependency>
   <dependencies>
</build>

एक प्लगइन के विपरीत, एक निर्भरता में एक गुंजाइश है।
डिफ़ॉल्ट स्कोप है compile। यह सबसे अधिक आवश्यक गुंजाइश है (फिर से विन्यास पर सम्मेलन)। गुंजाइश मतलब यह है कि निर्भरता एक परियोजना के सभी classpaths में उपलब्ध है।
compile

गुंजाइश परिभाषित करती है कि किस वर्ग में निर्भरता को जोड़ा जाना चाहिए। उदाहरण के लिए हमें संकलन और रनटाइम पर इसकी आवश्यकता है, या केवल परीक्षण संकलन और निष्पादन के लिए?

उदाहरण के लिए हमने पहले हाइबरनेट को एक compileनिर्भरता के रूप में परिभाषित किया है क्योंकि हमें हर जगह इसकी आवश्यकता है: स्रोत संकलन, परीक्षण संकलन, रनटाइम और इसलिए ....
लेकिन हम नहीं चाहते हैं कि परीक्षण पुस्तकालयों को आवेदन में पैक किया जाए या स्रोत कोड में संदर्भित किया जाए। । इसलिए हम testउनके लिए गुंजाइश निर्दिष्ट करते हैं:

<build>
   <dependencies>
     <dependency>
        <groupId>org.junit.jupiter</groupId>
        <artifactId>junit-jupiter-engine</artifactId>
        <version>5.1.0</version>
        <scope>test</scope>
     </dependency>
   <dependencies>
</build>

महान व्याख्या!, क्योंकि मैं जावा में निर्भरता स्थापित करने के साथ अच्छी तरह से वाकिफ नहीं हूं, मुझे अभी भी संदेह है, मैं वर्तमान में इंटेलीज में काम कर रहा हूं, और एक मावेन प्रोजेक्ट बनाया है, जब मैंने शामिल करने की कोशिश की webdriver-ieमेरे पास दो विकल्प हैं, या तो इसे शामिल करें pluginsया dependency, मैंने तुलना करने के लिए दोनों को शामिल किया, और देखा कि दोनों में groupIdकेवल एक ही अंतर है कि pluginsविशिष्ट संस्करण के साथ नहीं आया था लेकिन dependencyसाथ आया था 0.6.685। क्या आप इसे आम आदमी को समझा सकते हैं (इस उदाहरण के संबंध में) कि क्या अंतर है, कौन सा कब उपयोग करना है। कोई उपाय?
अनु

1
आपके देखे बिना सबसे सटीक उत्तर देना मुश्किल है pom.xml। लेकिन एक चीज जो आपको रूचि देनी चाहिए वह यह है कि निर्भरता संस्करण को निर्दिष्ट करना अनिवार्य है (वर्तमान पोम में या मूल पोम में यदि यह विरासत में मिली निर्भरता है) तो मावेन 3 के बाद से किसी भी मावेन संस्करण में (शायद एक अच्छा विचार है)। प्लगइन संस्करण निर्दिष्ट करना वैकल्पिक है। मावेन रिलीज रिपॉजिटरी में उपलब्ध अंतिम संस्करण का उपयोग करेगा जहां मावेन इसे पाता है। (१/२)
दाविदक्सएक्स

1
ध्यान दें कि यह एक प्लगइन निर्दिष्ट करने का एक बुरा तरीका है। यह आपके निर्माण को समय के साथ प्रतिलिपि नहीं बनाता है ( cwiki.apache.org/confluence/display/MAVEN/… )। आपको बिल्ड में एक चेतावनी देखनी चाहिए। तो अंतर क्या है ?"। प्लगिन एक मावेन बिल्ड के लिए कार्य करते हैं, जबकि निर्भरता निर्माण के दौरान क्लासपाथ में लाइब्रेरी (जार या जो भी) आवश्यक हैं। यदि आपकी परियोजना का निर्माण समान है जो भी मामला है (पुस्तकालय या प्लगइन का उपयोग करके), इसका मतलब है कि प्लगइन का उपयोग नहीं किया गया है (2/2)
davidxxx

6

यदि आप मेरी तरह फ्रंट-एंड बैकग्राउंड से आ रहे हैं, और ग्रंट और एनपीएम से परिचित हैं, तो इस तरह से सोचें:

पहले तुम दौड़ोगे, कहोगे npm install grunt-contrib-copy --save-dev। यह मावेन की तरह है <dependency></dependency>। यह बिल्ड कार्य को निष्पादित करने के लिए आवश्यक फ़ाइलों को डाउनलोड करता है।

तब आप Gruntfile.js में कार्य कॉन्फ़िगर करेंगे

copy: {
  main: {
    src: 'src/*',
    dest: 'dest/',
  },
}

यह मावेन की तरह है <plugin>/<plugin>। आप बिल्ड टूल बता रहे हैं कि npm / द्वारा डाउनलोड किए गए कोड का क्या करना है <dependency></dependency>

बेशक यह एक सटीक सादृश्य नहीं है, लेकिन इसके चारों ओर अपने सिर को लपेटने में मदद करने के लिए पर्याप्त करीब है।


4

प्लग-इन का उपयोग Mavenखुद को कार्यात्मकता जोड़ने के लिए किया जाता है (जैसे eclipseसमर्थन या SpringBootसमर्थन जोड़ने के लिए Mavenआदि)। किसी भी Maven चरण ( compileया testउदाहरण के लिए) पास करने के लिए आपके स्रोत कोड द्वारा निर्भरता की आवश्यकता होती है । के मामले में JUnitके बाद से परीक्षण कोड मूल रूप से अपने कोड बेस का हिस्सा है और आप कॉल JUnitपरीक्षण स्वीट अंदर विशिष्ट आदेश और उन आदेशों द्वारा प्रदान नहीं कर रहे हैं Java SDKइसलिए JUnitसमय में मौजूद होना चाहिए Mavenपरीक्षण चरण में है और इस उल्लेख के द्वारा नियंत्रित किया जाता JUnitएक निर्भरता के रूप में आपकी pom.xmlफ़ाइल में।


1

अपने दिल में मावेन एक प्लगइन निष्पादन रूपरेखा है - औपचारिक और मानक कॉम्पैक्ट परिभाषा के अनुसार। इसे और अधिक स्पष्ट करने के लिए, आपके द्वारा उपयोग किए जाने वाले कमांड, जैसे maven-install/clean/compile/build etcजार बनाने / निष्पादित करने के लिए, जिसे हम कभी-कभी मैन्युअल रूप से भी चलाते हैं। तो, जिन चीजों को आप चलाना चाहते हैं (या कॉन्फ़िगर करना या निष्पादित करना) आप मूल रूप से उन्हें मावेन पोम की निर्भरता टैग में डालते हैं और जवाब इस तरह से कि कौन इन निर्भरता को चलाएगा (पर्यावरण सेटअप के लिए आवश्यक) प्लगइन्स हो।

        javac (compiler) dependency.java (dependency) 

1

एक पंक्ति उत्तर - बुनियादी समझ

प्लगइन एक उपकरण है जिसका उपयोग आप अपने मावेन बिल्ड के निष्पादन में करते हैं

निर्भरता का अर्थ है किसी भी प्रकार की लाइब्रेरी जो आप अपने कोड में उपयोग करेंगे


0

एक प्लगइन मावेन के लिए एक विस्तार है, कुछ का उपयोग आपकी कलाकृतियों का निर्माण करने के लिए किया जाता है (उदाहरण के लिए मावेन-जार-प्लगइन का उपयोग किया जाता है, आप इसका अनुमान लगाते हैं, अपने संकलित वर्गों और संसाधनों से जार बनाते हैं)।

एक निर्भरता एक पुस्तकालय है जिसे आपके द्वारा बनाए जा रहे एप्लिकेशन, संकलन और / या परीक्षण और / या रनटाइम के समय की आवश्यकता होती है।

प्लगइन और निर्भरता

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