Maven npm के समान है?


84

जैसा कि मैंने npm के साथ काम किया है जो package.json फ़ाइल में निर्भरता की तलाश करता है और इसे आपके लिए डाउनलोड करता है। इसी तरह, मैं जावा प्रोजेक्ट में एक pom.xml फ़ाइल देखता हूं। क्या मावेन इस फ़ाइल में दिखता है और मेरे लिए निर्भरता डाउनलोड करता है। क्या मैं इस pom.xml फ़ाइल को package.json की तरह पास कर सकता हूँ, बजाय निर्भरता के जार देने के? क्या ये उपकरण समान हैं और बस विभिन्न प्लेटफार्मों के लिए निर्मित हैं?


जवाबों:


124

एक ही उपकरण, अलग भाषा?

जावा के लिए मावेन सबसे लोकप्रिय बिल्ड और डिपेंडेंसी रेजोल्यूशन टूल है, जैसे JS के लिए NPM है। लेकिन यह एक अलग भाषा के लिए सिर्फ एक ही उपकरण नहीं है। जावा और जेएस बिल्ड के बीच स्पष्ट रूप से भारी अंतर हैं, और ये अंतर मावेन के संचालन के तरीके में सीधे दिखाई देते हैं। उदाहरण के लिए, जबकि कई जेएस उपकरण कुछ भारी उठाने के लिए गिट पर भरोसा करते हैं, मावेन कस्टम फाइलसिस्टम-आधारित मावेन रिपॉजिटरी के साथ काम करता है, क्योंकि मावेन गित से पहले हैं और द्विआधारी कलाकृतियों को संभालने की जरूरत है, जो कि ऐतिहासिक रूप से अच्छी तरह से संभाल लेंगे। मावेन में स्रोतों और बायनेरिज़ के बीच एक स्पष्ट अलगाव है, जबकि वे अक्सर जेएस दुनिया में एक ही चीज हैं।

मवन मूल बातें

अपने शुद्धतम रूप में मावेन एक घोषणात्मक मॉडल का अनुसरण करता है, जहां pom.xml(इसी तरह package.json) बिल्ड के विभिन्न गुणों को परिभाषित करता है, लेकिन इसमें कोई स्क्रिप्ट नहीं होती है। नुकसान यह है कि स्क्रिप्ट का उपयोग किए बिना बिल्ड के कुछ पहलुओं को ठीक करने के लिए एक चुनौती हो सकती है क्योंकि आपको प्लगइन्स पर भरोसा करना होगा। फायदा यह है कि अन्य बिल्ड को समझना आसान हो सकता है pom.xml, क्योंकि वे आमतौर पर बहुत अधिक अनुकूलन के बिना एक ही दृष्टिकोण का पालन करते हैं। ग्रैडल एक लोकप्रिय ग्रूवी-आधारित टूल है जो मावेन मानकों और सम्मेलनों के शीर्ष पर बनाया गया है, और इसे विशेष रूप से pom.xmlइस "नो स्क्रिप्ट" बाधा को सरल बनाने और तोड़ने के लिए डिज़ाइन किया गया है ।

अपनी निर्भरताओं को संदर्भित करना

इसी तरह package.json, आप pom.xmlसीधे अपनी निर्भरता के साथ काम नहीं करते हैं, बल्कि निर्भरता निर्देशांक को परिभाषित करते हैं और अपने बिल्ड टूल को बाकी को संभालने देते हैं। मावेन में इन निर्देशांक का मूल रूप GAV (groupId, विरूपण साक्ष्य, संस्करण) है।

फ्लैट निर्भरता पेड़?

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

नोट: npm v3 के बाद से निर्भरता चपटी है। वैकल्पिक पैकेज प्रबंधक यार्न भी यही करता है।

परिपक्वता

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


4
उपरोक्त जानकारी के अलावा, निम्न Youtube Playlist एक महान काम करता है जिसमें पैकेज मैनेजर के रूप में मावेन के उपयोग का वर्णन किया गया है
टॉमी थॉम्पसन

1
मैं अक्सर एक पैकेज की खोज के लिए npmjs.com पर जाता हूं जो सहायक हो सकता है। मावेन ( search.maven.org ) पर ऐसा करने के लिए एक लिंक खोजने के लिए काफी हद तक लग गया । हालाँकि, खोजों ने मुझे डॉक्स की ओर इशारा नहीं किया, मुझे लोकप्रियता के मैट्रिक्स नहीं दिखाए, गितुब की ओर इशारा न करें। मुझे यह मददगार नहीं लगता है, यह सुझाव देते हुए कि यह कुछ लोग एनपीएम की अपेक्षा करते हैं लेकिन मावेन की नहीं।
जो लेप

NPM और मावेन के बीच एक बहुत अच्छी सांख्यिकीय तुलना यहाँ है: stackshare.io/stackups/npm-vs-gradle
cacoder

1
इस उत्तर के लिए एक अद्यतन: "इसके अलावा, मावेन एनपीएम की तुलना में काफी पुराना है, इसका एक बड़ा उपयोगकर्ता आधार है ..." यह संभवतः सच था जब प्रश्न मूल रूप से 2017 में उत्तर दिया गया था, लेकिन अब सटीक नहीं है। @Cacoder द्वारा पोस्ट किए गए लिंक के अनुसार, एनपीएम का उपयोगकर्ता आधार अब मावेन की तुलना में लगभग 11 गुना बड़ा है। स्रोत: stackshare.io/stackups/gradle-vs-maven-vs-npm
mnutsch

28

नीचे मैं |मावेन के बीच अलग करने के लिए उपयोग करता हूँ | क्रमशः npm शब्द:

आम सुविधाएं:

  • दोनों उपकरण एक डिस्क्रिप्टर फ़ाइल के आधार पर निर्भरता ( कलाकृतियों | पैकेज ) के डायनेमिक लाने का समर्थन करते हैं pom.xml| package.json, और आपको तैनात करने की अनुमति भी | अपनी खुद की कलाकृतियों को प्रकाशित करें | संकुल

  • वे दोनों एक डिफ़ॉल्ट सार्वजनिक भंडार है | रजिस्ट्री ( http://repo.maven.apache.org/maven2/ | https://registry.npmjs.org ), लेकिन 3 तीय-पक्ष भी (के माध्यम से इस्तेमाल किया जा सकता settings.xml|.npmrc )।

  • वे दोनों बिल्ड-लेवल निर्भरता (प्लगइन्स | स्क्रिप्ट में उपयोग की जाने वाली निर्भरता) की अवधारणा का समर्थन करते हैं । * मावेन providedनिर्भरता का भी समर्थन करता है, लेकिन यह npm पर लागू नहीं होता है, क्योंकि जावास्क्रिप्ट शायद ही कभी कंटेनर में तैनात होता है।

  • वे दोनों निर्भरता नामस्थान का समर्थन करते हैं: groupId|scope

Differrences:

  • मावेन के पास एक अतिरिक्त स्थानीय भंडार (कैश) है:

    • विभिन्न परियोजनाओं के लिए फिर से समान निर्भरता लाने की आवश्यकता नहीं है।
    • स्थानीय रूप से स्थापित कलाकृतियाँ, अन्य स्थानीय परियोजनाओं द्वारा स्वचालित रूप से सुलभ हैं।
  • मावेन में एक परियोजना के निर्माण से निर्भरता में डाउनलोड किया जाता है <homedir>/.m2। Npm के साथ उन्हें डाउनलोड किया जाता है <projectdir>/node_modules

  • मावेन में निर्माण आमतौर पर एक-चरणीय प्रक्रिया है : mvn package(लाने के लिए डिप, निर्माण)। Npm में यह एक 2-चरण प्रक्रिया है: npm install(लाने के लिए), npm build(निर्माण)

  • Maven को परिभाषित करता है निर्माण lifecycles (निर्माण, परीक्षण, तैनाती के लिए) , चरणों शामिल थे जो करने के लिए डिफ़ॉल्ट परिचालन (प्लगइन लक्ष्यों) देते हैं , differrent पैकेजिंग विकल्प (के आधार पर .jar, .war, .earआदि)। फिर आप इन ऑपरेशनों को अधिलेखित कर सकते हैं, या नए (इंजेक्शन सिस्टम के माध्यम से) इंजेक्ट कर सकते हैं। यह निर्माण के लिए आउट-ऑफ-द-बॉक्स समाधान प्रदान करता है, docgen, परीक्षण, तैनाती आदि
    npm दृष्टिकोण अधिक सरल है (देखें: स्क्रिप्ट )

  • उपरोक्त के कारण, npm को जावास्क्रिप्ट के लिए पैकेज-मैनेजमेंट टूल के रूप में लेबल किया गया है, जबकि मेव को जावा के लिए बिल्ड-ऑटोमेशन और डिपेंडेंसी-मैनेजमेंट टूल के रूप में लेबल किया गया है ।

  • मावेन की स्थापना में निर्माण प्रक्रिया को अधिक आम तौर पर संपादितpom.xml करना शामिल है
    Npm में यह कोड लिखना या पूरक निर्माण उपकरण जैसे कॉन्फ़िगर करना gulp, webpackआदि शामिल है

  • Npm मॉड्यूल में उपयोगकर्ताओं द्वारा परिभाषित कुछ कारण संस्करण सीमाओं के लिए , मावेन की तुलना में बहुत अधिक ढीले हैं । यह परिवर्तनशील निर्भरता के साथ समस्याएँ पैदा कर सकता है, यही कारण है कि हाल ही में एक अतिरिक्त फ़ाइल जोड़ी गई:package-lock.json

  • एनपीएम के साथ यह एक नई परियोजना शुरू करने के लिए बहुत अधिक सीधा हैnpm init :। मावेन के साथ, आपको यह जानना होगा कि कैसे एक न्यूनतम लिखना है pom.xml, या कट्टरपंथियों के बारे में पढ़ना है।

  • सामान्य तौर पर यह संपादित करने के लिए बहुत अधिक सामान्य pom.xmlहै package.json। उदाहरण के लिए, maven में निर्भरता को मैन्युअल रूप से (या IDE के माध्यम से) किया जाता है जबकि npm में कमांड लाइन के माध्यम से

  • जैसा कि सभी बिल्ड टूल के साथ होता है, आप एक टूल को दूसरे के अंदर से कॉल कर सकते हैं, लेकिन मुझे लगता है कि इसके mpm के अंदर से npm को कॉल करने के लिए इसके विपरीत कॉमन है ।

  • npm देव का समर्थन करता है , उत्पादन बनाता है । मावेन में इसे प्रोफाइल के माध्यम से परिभाषित करने की आवश्यकता है ।


5

हाँ। यह जावा के लिए एक समान पैकेजिंग उपकरण है। देखने के लिए gradleभी है जो आप के साथ और अधिक स्वतंत्रता देता है groovy language, लेकिन के लिए शुरू आप उपयोग कर सकते हैं mavenअपने निर्भरता को व्यवस्थित करने के। आप उन्हें वहां टैग के रूप में शामिल करते हैं और मावेन आपके लिए काम करता है।

यह निर्भरता पेड़ का पता लगाता है और सभी उपयुक्त जार को डाउनलोड करता है।


1
यकीन नहीं है क्योंकि मैं इन सभी js उपकरणों से परिचित नहीं हूँ। gradleएक maven + antसाथ चलो कहते हैं। यह वही करता है जो मावेन करता है, लेकिन यह आपको सभी डी-फैक्टो नौकरियों के अलावा कोड और स्क्रिप्ट लिखने की स्वतंत्रता भी देता है। मैं gulpअभी पर एक नज़र था । शायद यह वही है, जो मैंने पढ़ा है। यदि आप मावेन बनाम प्रवण का उपयोग करना शुरू करना चाहते हैं, तो मैं सुझाव दूंगा कि शुरुआत के साथ mavenऔर अधिक स्पष्ट और समझने में आसान है और फिर साथ गड़बड़ करें gradle!
Apostolos

धन्यवाद। मावेन में फ्लैट निर्भरता पेड़ या नेस्टेड निर्भरता पेड़ है?
शुभम जैन

1
उदाहरण के लिए यहाँ देखें mvnrepository.com/artifact/org.hibernate/hibernate-core/… । हाइबरनेट विभिन्न अन्य पुस्तकालयों पर निर्भर करता है, लेकिन इन जार को हाइबरनेट लाइब्रेरी के अंदर स्थानीय मावेन रेपो में संग्रहीत नहीं किया जाएगा।
Apostolos

1
मुझे लगता है कि नेस्टेड (सकर्मक) निर्भरता से निपटने में अंतर है। प्रत्येक नोड मॉड्यूल में एक निर्भरता का अपना संस्करण हो सकता है जबकि मावेन एकल सामान्य निर्भरता को हल करने का प्रयास करेगा यदि कई निर्भरता के लिए एक ही तीसरी निर्भरता की आवश्यकता होती है लेकिन एक अलग संस्करण में। मैं यह भी कहूंगा कि इसके कार्य के बाद से ग्रंट मैच ग्रैंगल मैच हो जाएगा। ग्रेडल चींटी + आइवी अधिक है जबकि मावेन दृढ़ता से संचालित है। हो सकता है कि वेबपैक के करीब हो, लेकिन ऐसा कुछ भी न हो।
वेमु जू

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

0

हां, समान के साथ, लेकिन वे npm के रूप में उपयोगकर्ता के अनुकूल नहीं हैं।

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