अपाचे मावेन
Developer(s) | अपाचे सॉफ्टवेयर फाउंडेशन |
---|---|
Initial release | 13 July 2004 |
Stable release | 3.9.2
/ 11 May 2023[1] |
Written in | जावा |
Type | उपकरण |
License | अपाचे लाइसेंस 2.0 |
Website | maven |
अपाचे मावेन एक 'बिल्ड-ऑटोमेशन टूल' है जिसका उपयोग मुख्य रूप से जावा लैंग्वेज की परियोजनाओं के लिए किया जाता है। अपाचे मावेन का उपयोग सी, रूबी, स्काला और अन्य लैंग्वेज में लिखी गई परियोजनाओं (प्रोजेक्ट) को बनाने और प्रबंधित करने के लिए भी किया जा सकता है। मावेन परियोजना को अपाचे सॉफ्टवेयर फाउंडेशन द्वारा प्रारम्भ किया गया है, जहां यह पहले जकार्ता नामक परियोजना का भाग था।
अपाचे मावेन सॉफ्टवेयर निर्माण के दो संस्करणों पर चर्चा करता है कि सॉफ्टवेयर कैसे बनाया जाता है और उसकी निर्भरताएँ अपाचे एंट जैसे पुराने टूल के विपरीत निर्माण प्रक्रिया के लिए कैसे संस्करणों का उपयोग करती है। सामान्यतः इसमे केवल एक्सेप्शन निर्दिष्ट करने की आवश्यकता होती है। एक्सएमएल फ़ाइले बनाए जा रहे सॉफ़्टवेयर या अन्य बाहरी मॉड्यूल और फंक्शनों पर इसकी निर्भरता build_order
, directory
और आवश्यक प्लग-इन का वर्णन करती है। यह कोड के निष्पादन और इसकी पैकेजिंग जैसे कुछ अच्छी तरह से परिभाषित कार्यों को करने के लिए पूर्व-निर्धारित लक्ष्यों के साथ आता है। अपाचे मावेन गतिशील रूप से एक या अधिक जानकारी जैसे अपाचे मावेन संस्करण 2 मुख्य जावा लाइब्रेरी और अपाचे मावेन प्लग-इन को डाउनलोड करता है और उन्हें स्थानीय कैश में संग्रहीत करता है।[2] डाउनलोड की गई फ़ाइलों के इस स्थानीय कैश को स्थानीय परियोजनाओं द्वारा बनाई गई फ़ाइलों के साथ भी अपडेट किया जा सकता है। इसके साथ ही सार्वजनिक जानकारी को भी अपडेट किया जा सकता है।
अपाचे मावेन को एक प्लग-इन आधारित संरचना का उपयोग करके बनाया गया है जो इसे मानक इनपुट के माध्यम से नियंत्रित किसी भी एप्लिकेशन का उपयोग करने की स्वीकृति देती है। अपाचे मावेन संस्करण 2 के लिए सी /सी++ (प्रोग्रामिंग लैंग्वेज) मे नेटिव प्लग-इन को बनाया गया है।[3]
बिल्ड टूल के रूप में ग्रैडल और एसबीटी जैसी वैकल्पिक प्रौद्योगिकियां एक्सएमएल पर निर्भर नहीं हैं, लेकिन मावेन द्वारा प्रस्तुत की गई प्रमुख अवधारणाओं को सुरक्षित रखती हैं। अपाचे आइवी के साथ एक समर्पित निर्भरता प्रबंधक को विकसित किया गया था जो अपाचे मावेन जानकारी का भी समर्थन करता है।[4] अपाचे मावेन को प्रतिलिपि प्रस्तुत करने योग्य बिल्ड ऑटोमेशन टूल के लिए समर्थन प्राप्त है।[5][6]
इतिहास
अपाचे मावेन को 2002 में जेसन वैन ज़ाइल द्वारा निर्मित अपाचे टर्बाइन की एक उप-परियोजना के रूप में प्रारम्भ किया गया था। 2003 में इस पर मतदान हुआ और इसे अपाचे सॉफ्टवेयर फाउंडेशन परियोजना के रूप में स्वीकृत किया गया था। जुलाई 2004 में अपाचे मावेन की प्रकाशन महत्वपूर्ण पहला 1.0 संस्करण था। बीटा चक्रों में लगभग छह महीने के बाद अक्टूबर 2005 में अपाचे मावेन संस्करण 2 को v2.0 के रूप मे घोषित किया गया था। अपाचे मावेन 3.0 को अक्टूबर 2010 में प्रकाशित किया गया था जो कि अधिकांश अपाचे मावेन संस्करण 2 के साथ पूर्व संस्करण के संगत था।
अपाचे मावेन 3.0 की जानकारी 2008 में बाहर आना प्रारम्भ हुई। आठ अल्फा प्रकाशन के बाद अपाचे मावेन 3.0 का पहला बीटा संस्करण अप्रैल 2010 में प्रारम्भ किया गया था। अपाचे मावेन 3.0 ने कोर परियोजना निर्मित संरचना को पुनः तैयार किया गया था। जिसके परिणामस्वरूप पीओएम की फ़ाइल-आधारित प्रतिनिधित्व को इससे अलग कर दिया गया था। इसने गैर-एक्सएमएल आधारित परियोजना की फ़ाइलों का लाभ प्राप्त करने के लिए अपाचे मावेन 3.0 ऐड-ऑन की संभावना का विस्तार किया था। साझा की गई लैंग्वेज में रूबी (पहले से ही जेसन वैन ज़ाइल द्वारा निजी प्रोटोटाइप में), वाईएएमएल और ग्रूवी लैंग्वेज सम्मिलित हैं।
अपाचे मावेन 3.0 से अपाचे मावेन संस्करण 2.0 की पूर्व संगतता सुनिश्चित करने पर विशेष ध्यान दिया गया था। अधिकांश परियोजनाओं के लिए, अपाचे मावेन 3.0 में अपग्रेड करने के लिए उनकी परियोजना संरचना में किसी भी समायोजन की आवश्यकता नहीं थी। अपाचे मावेन 3.0 के पहले बीटा संस्करण में एक समानांतर बिल्ड सुविधा प्रारम्भ मे देखी गई थी जो 'मल्टी-कोर मशीन' को अपडेट करने योग्य संख्या का लाभ प्राप्त करती है और विशेष रूप से वह अपेक्षाकृत बड़ी मल्टी-मॉड्यूल परियोजनाओं के लिए उपयुक्त है।
एल्गोरिथम
अपाचे मावेन परियोजना को परियोजना ऑब्जेक्ट मॉडल (पीओम) का उपयोग करके परिवर्तित किया गया है, जो एक pom.xml
फ़ाइल में संग्रहीत है। उदाहरण के लिए फ़ाइल इस प्रकार प्रदर्शित होती है:
<project>
<!-- model version is always 4.0.0 for Maven 2.x POMs -->
<modelVersion>4.0.0</modelVersion>
<!-- project coordinates, i.e. a group of values which uniquely identify this project -->
<groupId>com.mycompany.app</groupId>
<artifactId>my-app</artifactId>
<version>1.0</version>
<!-- library dependencies -->
<dependencies>
<dependency>
<!-- coordinates of the required library -->
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<!-- this dependency is only used for running and compiling tests -->
<scope>test</scope>
</dependency>
</dependencies>
</project>
यह मॉडल केवल परियोजना के लिए एक अद्वितीय पहचानकर्ता और JUnit
संरचना पर इसकी निर्भरता को परिभाषित करता है। हालाँकि यह परियोजना बनाने और परियोजना से संबद्ध इकाई परीक्षण को चलाने के लिए पहले से ही पर्याप्त है। अपाचे मावेन कॉन्फ़िगरेशन पर फंक्शन के विचार को स्वीकृत करके इसे पूरा करता है, अर्थात यह अपाचे मावेन परियोजना के कॉन्फ़िगरेशन के लिए डिफ़ॉल्ट मान प्रदान करता है। एक सामान्य अपाचे मावेन परियोजना की directory
संरचना में निम्नलिखित directory
प्रविष्टियाँ होती हैं:
डायरेक्टरी का नाम | Purpose |
---|---|
project_home
|
इसमें pom.xml और सभी directory सम्मिलित हैं।
|
src/main/java
|
परियोजना के लिए डिलिवरेबल जावा स्रोतकोड सम्मिलित है। |
src/main/resources
|
इसमें परियोजना के लिए फ़ाइलें जैसे वितरण योग्य संसाधन सम्मिलित हैं। |
src/test/java
|
परियोजना के लिए परीक्षण जावा स्रोतकोड (उदाहरण के लिए JUnit या TestNG परीक्षण) सम्मिलित हैं।
|
src/test/resources
|
परीक्षण के लिए आवश्यक संसाधन सम्मिलित हैं। |
कमांड mvn package
सभी जावा फ़ाइलों को कार्यान्वित करती है यदि कोई भी परीक्षण कार्यान्वित किया जाता है तो वितरण योग्य कोड और संसाधनों को target/my-app-1.0.jar
पैकेज मे सम्मिलित करता है यह मानते हुए कि artifactId
संस्करण 1.0 एप्लिकेशन है।
अपाचे मावेन का उपयोग करते हुए, उपयोगकर्ता परियोजना के लिए केवल कॉन्फ़िगरेशन प्रदान करता है, जबकि कॉन्फ़िगर करने योग्य प्लग-इन परियोजना को संकलित करने, लक्ष्य directory
को साफ़ करने, परीक्षण चलाने, एपीआई दस्तावेज़ तैयार करने आदि का वास्तविक कार्य करते हैं। सामान्यतः उपयोगकर्ताओं को स्वयं प्लग-इन लिखने की आवश्यकता नहीं होनी चाहिए। इसकी तुलना अपाचे एंट और मेक से की जा सकती है। जिसमें उपरोक्त कार्यों को करने के लिए अनिवार्य प्रक्रियाएं कार्यान्वित की जाती हैं।
डिज़ाइन
परियोजना ऑब्जेक्ट मॉडल
एक परियोजना ऑब्जेक्ट मॉडल (पीओएम) एक ही परियोजना के लिए सभी कॉन्फ़िगरेशन प्रदान करता है।[7] सामान्य कॉन्फ़िगरेशन में परियोजना का नाम, उसके मालिक और अन्य परियोजना पर उसकी निर्भरता सम्मिलित होती है। कोई व्यक्ति निर्माण प्रक्रिया के अलग-अलग चरणों को भी कॉन्फ़िगर कर सकता है, जिन्हें प्लगइन के रूप में कार्यान्वित किया जाता है। उदाहरण के लिए, कोई निष्पादन के लिए जावा संस्करण 1.5 का उपयोग करने के लिए कंपाइलर-प्लगइन को कॉन्फ़िगर कर सकता है या कुछ यूनिट परीक्षण विफल होने पर भी परियोजना की पैकेजिंग निर्दिष्ट कर सकता है।
बड़ी परियोजनाओं को कई मॉड्यूल या उप-परियोजनाओं में विभाजित किया जाना चाहिए, जिनमें से प्रत्येक का अपना पीओएम हो। फिर कोई एक रूट पीओएम लिख सकता है जिसके माध्यम से कोई एक ही कमांड के साथ सभी मॉड्यूल संकलित कर सकता है। पीओएम अन्य पीओएम से कॉन्फ़िगरेशन भी प्राप्त कर सकते हैं। सभी पीओएम डिफ़ॉल्ट रूप से सुपर पीओएम से प्राप्त होते हैं। सुपर पीओएम डिफ़ॉल्ट कॉन्फ़िगरेशन प्रदान करता है, जैसे डिफ़ॉल्ट स्रोत निर्देशिकाएं, डिफ़ॉल्ट प्लगइन्स इत्यादि।[8]
प्लग-इन
अपाचे मावेन की अधिकांश कार्यक्षमता प्लग-इन में है। एक प्लगइन लक्ष्यों का एक सेट प्रदान करता है जिसे कमांड mvn [plugin-name]:[goal-name]
का उपयोग करके निष्पादित किया जा सकता है। उदाहरण के लिए, एक जावा परियोजना को mvn compiler:compile
चलाकर कंपाइलर-प्लगइन के कंपाइल-लक्ष्य के साथ संकलित किया जा सकता है।[9]
निर्माण, परीक्षण, स्रोत नियंत्रण प्रबंधन, वेब सर्वर चलाने, एक्लिप्स परियोजना फ़ाइलें उत्पन्न करने और बहुत कुछ के लिए मावेन प्लगइन्स हैं।[10] प्लगइन्स को pom.एक्सएमएल
फ़ाइल के <प्लगइन्स>-सेक्शन में प्रस्तुत और कॉन्फ़िगर किया जाता है। प्रत्येक परियोजना में कुछ बुनियादी प्लगइन्स डिफ़ॉल्ट रूप से सम्मिलित होते हैं, और उनमें समझदार डिफ़ॉल्ट सेटिंग्स होती हैं।
हालाँकि, यह बोझिल होगा यदि किसी सॉफ़्टवेयर परियोजना के निर्माण, परीक्षण और पैकेजिंग के मूल निर्माण क्रम में प्रत्येक संबंधित लक्ष्य को मैन्युअल रूप से चलाने की आवश्यकता हो:
mvn compiler:compile
mvn surefire:test
mvn jar:jar
मावेन की जीवनचक्र अवधारणा इस मुद्दे को संभालती है।
प्लगइन्स मावेन का विस्तार करने का प्राथमिक तरीका है। Maven प्लगइन का विकास org.apache.maven.plugin.AbstractMojo
क्लास का विस्तार करके किया जा सकता है। एप्लिकेशन सर्वर चलाने वाली क्लाउड-आधारित वर्चुअल मशीन बनाने के लिए मावेन प्लगइन का उदाहरण कोड और स्पष्टीकरण क्लाउड वर्चुअल मशीनों के स्वचालित विकास और प्रबंधन लेख में दिया गया है।[11]
जीवनचक्र बनाएं
बिल्ड जीवनचक्र नामित चरणों की एक सूची है जिसका उपयोग लक्ष्य निष्पादन के लिए आदेश देने के लिए किया जा सकता है। मावेन के मानक जीवनचक्रों में से एक डिफ़ॉल्ट जीवनचक्र है, जिसमें इस क्रम में निम्नलिखित चरण सम्मिलित हैं:[12]
- मान्य करें
- उत्पन्न-स्रोत
- प्रक्रिया-स्रोत
- संसाधन उत्पन्न करें
- प्रक्रिया-संसाधन
- संकलित करें
- प्रक्रिया-परीक्षण-स्रोत
- प्रक्रिया-परीक्षण-संसाधन
- परीक्षण-निष्पादन
- परीक्षा
- पैकेट
- स्थापित करना
- तैनात करना
प्लगइन्स द्वारा प्रदान किए गए लक्ष्य जीवनचक्र के विभिन्न चरणों से जुड़े हो सकते हैं। उदाहरण के लिए, डिफ़ॉल्ट रूप से, लक्ष्य "संकलक: निष्पादन" "निष्पादन" चरण से जुड़ा होता है, जबकि लक्ष्य "अचूक: परीक्षण" "परीक्षण" चरण से जुड़ा होता है। जब mvn_test
कमांड निष्पादित किया जाता है, तो मावेन test
चरण तक और इसमें सम्मिलित प्रत्येक चरण से जुड़े सभी लक्ष्यों को चलाता है। ऐसे मामले में, मावेन "प्रक्रिया-संसाधन" चरण से जुड़े "संसाधन:संसाधन" लक्ष्य को चलाता है, फिर "संकलक:निष्पादन" को चलाता है और इसी प्रकार जब तक यह अंततः "अचूक:परीक्षण" लक्ष्य को नहीं चलाता।
अपाचे मावेन के पास परियोजना की सफाई और परियोजना स्थल तैयार करने के लिए मानक चरण भी हैं। यदि सफाई डिफ़ॉल्ट जीवनचक्र का हिस्सा होती, तो परियोजना के निर्माण के समय हर बार उसे साफ किया जाता। यह स्पष्ट रूप से अवांछनीय है, इसलिए सफाई को अपना स्वयं का जीवनचक्र दिया गया है।
मानक जीवनचक्र किसी परियोजना में नए उपयोगकर्ताओं को एकल कमांड mvn_install
जारी करके प्रत्येक मावेन परियोजना को सटीक रूप से बनाने, परीक्षण करने और स्थापित करने की क्षमता प्रदान करता है। डिफ़ॉल्ट रूप से, मावेन पीओम फ़ाइल को जेनरेट की गई JAR और WAR फ़ाइलों में पैकेज करता है। Diet4j
जैसे उपकरण इस जानकारी का उपयोग रन-टाइम पर मावेन मॉड्यूल को पुनरावर्ती रूप से हल करने और चलाने के लिए कर सकते हैं, बिना "uber" -jar
की आवश्यकता के जिसमें सभी परियोजना कोड सम्मिलित हैं।[13]
निर्भरताएँ
मावेन में एक केंद्रीय विशेषता निर्भरता प्रबंधन है। मावेन की निर्भरता-हैंडलिंग तंत्र को सॉफ़्टवेयर लाइब्रेरी या मॉड्यूल जैसी व्यक्तिगत फ़ाइलों की पहचान करने वाली एक समन्वय प्रणाली के आसपास व्यवस्थित किया जाता है। उपरोक्त पीओम उदाहरण JUnit
निर्देशांक को परियोजना की प्रत्यक्ष निर्भरता के रूप में संदर्भित करता है। एक परियोजना जिसे हाइबरनेट (जावा) लाइब्रेरी की आवश्यकता होती है, उसे बस अपने पीओएम में हाइबरनेट के परियोजना निर्देशांक घोषित करना होता है। अपाचे मावेन स्वचालित रूप से निर्भरता और उन निर्भरताओं को डाउनलोड करेगा जिनकी हाइबरनेट को स्वयं आवश्यकता है (जिन्हें ट्रांजिटिव निर्भरता कहा जाता है) और उन्हें उपयोगकर्ता के स्थानीय भंडार में संग्रहीत करेगा। अपाचे मावेन संस्करण 2 सेंट्रल जानकारी का उपयोग डिफ़ॉल्ट रूप से पुस्तकालयों की खोज के लिए किया जाता है, लेकिन कोई पीओएम के भीतर उपयोग की जाने वाली जानकारी (जैसे कंपनी-निजी जानकारी) को कॉन्फ़िगर कर सकता है।[2]
अपाचे मावेन और एंट के बीच मूलभूत अंतर यह है कि अपाचे मावेन का डिज़ाइन सभी परियोजनाओं को एक निश्चित संरचना और समर्थित कार्य कार्य-प्रवाह का एक सेट मानता है उदाहरण के लिए, स्रोत नियंत्रण से संसाधन प्राप्त करना, परियोजना को संकलित करना, इकाई परीक्षण इत्यादि)। जबकि अधिकांश सॉफ्टवेयर परियोजना वास्तव में इन ऑपरेशनों का समर्थन करते हैं और वास्तव में एक अच्छी तरह से परिभाषित संरचना होती है, अपाचे मावेन के लिए आवश्यक है कि इस संरचना और ऑपरेशन कार्यान्वयन विवरण को पीओएम फ़ाइल में परिभाषित किया जाए। इस प्रकार मावेन परियोजनाओं को परिभाषित करने के तरीके और कार्य-प्रवाह की सूची पर एक सम्मेलन पर निर्भर करता है जो सामान्यतः सभी परियोजनाओं में समर्थित होते हैं।[14][15]
द सेंट्रल जानकारी सर्च इंजन जैसे खोज इंजन हैं, जिनका उपयोग विभिन्न ओपन-सोर्स लाइब्रेरी और फ्रेमवर्क के लिए निर्देशांक खोजने के लिए किया जा सकता है।
एक ही मशीन पर विकसित परियोजनाएं स्थानीय जानकारी के माध्यम से एक-दूसरे पर निर्भर हो सकती हैं। स्थानीय जानकारी एक सरल फ़ोल्डर संरचना है जो डाउनलोड की गई निर्भरता के लिए कैश के रूप में और स्थानीय रूप से निर्मित फ़ाइलों के लिए केंद्रीकृत भंडारण स्थान के रूप में कार्य करती है। मावेन कमांड mvn install
एक परियोजना बनाता है और उसके बायनेरिज़ को स्थानीय जानकारी में रखता है। फिर, अन्य परियोजनाएं अपने पीओएम में इसके निर्देशांक निर्दिष्ट करके इस परियोजना का उपयोग कर सकती हैं।
अंतरसंचालनीयता
जावा प्रोग्रामिंग लैंग्वेज को लक्षित करने वाले कई लोकप्रिय एकीकृत विकास वातावरण (आईडीई) में ऐड-ऑन आईडीई के निर्माण तंत्र और स्रोत संपादन टूल के साथ मावेन का एकीकरण प्रदान करने के लिए सम्मिलित हैं, जिससे मावेन को आईडीई के भीतर से परियोजनाओं को संकलित करने और कोड के लिए क्लासपाथ सेट करने की भी स्वीकृति मिलती है। संकलक त्रुटियों आदि को उजागर करना पूरा करना।
मावेन के साथ विकास का समर्थन करने वाले लोकप्रिय आईडीई के उदाहरणों में सम्मिलित हैं:
- ग्रहण (सॉफ्टवेयर)
- NetBeans
- इंटेलीजे आइडिया
- जेबिल्डर
- J डेवलपर (संस्करण 11.1.2)
- मेरा ग्रहण
- विजुअल स्टूडियो कोड
ये ऐड-ऑन सीधे आईडीई के भीतर किसी परियोजना की निर्भरता के पूर्ण सेट को निर्धारित करने के लिए पीओएम को संपादित करने या पीओएम का उपयोग करने की क्षमता भी प्रदान करते हैं।
जब आईडीई अब निष्पादन नहीं करता है तो आईडीई की कुछ अंतर्निहित विशेषताएं समाप्त हो जाती हैं। उदाहरण के लिए, एक्लिप्स के जेडीटी में संपादित होने के बाद एकल जावा स्रोत फ़ाइल को पुन: संकलित करने की क्षमता है। कई आईडीई मावेन द्वारा पसंद किए गए फ़ोल्डरों के पदानुक्रम के बजाय परियोजनाओं के एक फ्लैट सेट के साथ कार्य करते हैं। यह अपाचे मावेन का उपयोग करते समय आईडीई में एससीएम सिस्टम के उपयोग को जटिल बनाता है।[16][17][18]
यह भी देखें
संदर्भ
- ↑ "Maven Release Notes – Maven 3.9.2". maven.apache.org.
- ↑ 2.0 2.1 "Index of /maven2/". Archived from the original on 2018-09-17. Retrieved 2009-04-15.
- ↑ Laugstol, Trygve. "मोजोहॉस नेटिव मावेन प्लगइन".
- ↑ "IBiblio Resolver | Apache Ivy™".
- ↑ "Reproducible/Verifiable Builds - Apache Maven - Apache Software Foundation". cwiki.apache.org.
- ↑ "जावा में प्रतिलिपि प्रस्तुत करने योग्य बिल्ड - डीज़ोन जावा". dzone.com.
- ↑ POM Reference
- ↑ Super POM
- ↑ Punzalan, Edwin. "Apache Maven Compiler Plugin – Introduction".
- ↑ Marbaise, Brett Porter Jason van Zyl Dennis Lundberg Olivier Lamy Benson Margulies Karl-Heinz. "Maven – Available Plugins".
- ↑ Amies, Alex; Zou P X; Wang Yi S (29 Oct 2011). "क्लाउड वर्चुअल मशीनों का स्वचालित विकास और प्रबंधन". IBM DeveloperWorks. IBM.
- ↑ Porter, Brett. "Maven – Introduction to the Build Lifecycle".
- ↑ "diet4j - put Java JARs on a diet, and load maven modules as needed".
- ↑ "Maven: The Complete Reference". Sonatype. Archived from the original on 21 April 2013. Retrieved 11 April 2013.
- ↑ The Central Repository Search Engine
- ↑ "maven.apache.org/eclipse-plugin.html". Archived from the original on May 7, 2015.
- ↑ "IntelliJ IDEA :: Features".
- ↑ "MavenBestPractices - NetBeans Wiki".
अग्रिम पठन
- O'Brien, Tim; et al. "Maven: The Complete Reference". Sonatype.com. Sonatype. Retrieved 15 March 2013.
- Maven: The Definitive Guide. Sonatype Company. O'Reilly Media, Inc. 2009. p. 470. ISBN 9780596551780. Retrieved 2013-04-17.
{{cite book}}
: CS1 maint: others (link) - Van Zyl, Jason (2008-10-01), Maven: Definitive Guide (first ed.), O'Reilly Media, pp. 468, ISBN 978-0-596-51733-5
- "Running JUnit tests from Maven2". JUnit in Action (2nd ed.). Manning Publications. 2011. pp. 152–168. ISBN 978-1-935182-02-3.
- Maven Build Customization. Packt. 2013. pp. 1–250. ISBN 9781783987221.
- Mastering Apache Maven 3. Packt. 2014. p. 298. ISBN 9781783983865.
बाहरी संबंध
- No URL found. Please specify a URL here or add one to Wikidata.
- Maven in 5 minutes