क्या कोई मुझे चींटी और मावेन के बीच का अंतर बता सकता है? मैंने कभी इस्तेमाल नहीं किया। मैं समझता हूं कि वे जावा परियोजनाओं के निर्माण को स्वचालित करने के लिए उपयोग किए जाते हैं, लेकिन मुझे नहीं पता कि कहां से शुरू करना है।
क्या कोई मुझे चींटी और मावेन के बीच का अंतर बता सकता है? मैंने कभी इस्तेमाल नहीं किया। मैं समझता हूं कि वे जावा परियोजनाओं के निर्माण को स्वचालित करने के लिए उपयोग किए जाते हैं, लेकिन मुझे नहीं पता कि कहां से शुरू करना है।
जवाबों:
में Maven: यह निश्चित गाइड , मैं परिचय अनुभाग शीर्षक है में Maven और चींटी के बीच मतभेद के बारे में लिखा "चींटी और Maven के बीच अंतर" । यहाँ एक जवाब है कि कुछ अतिरिक्त नोट्स के साथ उस परिचय में जानकारी का एक संयोजन है।
एक साधारण तुलना
मैं आपको केवल इस विचार को दर्शाने के लिए दिखा रहा हूं कि, सबसे बुनियादी स्तर पर, मावेन ने अंतर्निर्मित सम्मेलनों का निर्माण किया है। यहाँ एक साधारण चींटी बिल्ड फ़ाइल है:
<project name="my-project" default="dist" basedir=".">
<description>
simple example build file
</description>
<!-- set global properties for this build -->
<property name="src" location="src/main/java"/>
<property name="build" location="target/classes"/>
<property name="dist" location="target"/>
<target name="init">
<!-- Create the time stamp -->
<tstamp/>
<!-- Create the build directory structure used by compile -->
<mkdir dir="${build}"/>
</target>
<target name="compile" depends="init"
description="compile the source " >
<!-- Compile the java code from ${src} into ${build} -->
<javac srcdir="${src}" destdir="${build}"/>
</target>
<target name="dist" depends="compile"
description="generate the distribution" >
<!-- Create the distribution directory -->
<mkdir dir="${dist}/lib"/>
<!-- Put everything in ${build} into the MyProject-${DSTAMP}.jar file
-->
<jar jarfile="${dist}/lib/MyProject-${DSTAMP}.jar" basedir="${build}"/>
</target>
<target name="clean"
description="clean up" >
<!-- Delete the ${build} and ${dist} directory trees -->
<delete dir="${build}"/>
<delete dir="${dist}"/>
</target>
</project>
इस सरल चींटी उदाहरण में, आप देख सकते हैं कि आपको चींटी को वास्तव में क्या करना है। एक संकलित लक्ष्य है जिसमें javac कार्य शामिल है जो स्रोत को src / main / java निर्देशिका में लक्ष्य / वर्ग निर्देशिका में संकलित करता है। आपको चींटी को बताना होगा कि आपका स्रोत कहां है, जहां आप चाहते हैं कि परिणामी बायोटेक संग्रहीत किया जाए, और यह सब कैसे एक JAR फ़ाइल में पैकेज किया जाए। जबकि हाल के कुछ घटनाक्रम हैं जो चींटी को कम प्रक्रियात्मक बनाने में मदद करते हैं, चींटी के साथ एक डेवलपर का अनुभव XML में लिखी गई एक प्रक्रियात्मक भाषा को कोड करने में है।
मावेन उदाहरण के साथ पिछले चींटी उदाहरण का विरोध करें। मावेन में, कुछ जावा स्रोत से एक JAR फ़ाइल बनाने के लिए, आपको बस एक साधारण pom.xml बनाना होगा, अपने स्रोत कोड को $ {आधारित / src / main / java में रखें और फिर कमांड लाइन से mvan इंस्टॉल करें। । उदाहरण Maven pom.xml जो समान परिणाम प्राप्त करता है।
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>org.sonatype.mavenbook</groupId>
<artifactId>my-project</artifactId>
<version>1.0</version>
</project>
यह सब आप अपने pom.xml में की जरूरत है। कमांड लाइन से इंस्टॉल किया गया रनिंग मावन संसाधनों को संकलित करेगा, स्रोत संकलित करेगा, यूनिट टेस्ट निष्पादित करेगा, एक JAR बनाएगा, और JAR को अन्य परियोजनाओं में पुन: उपयोग के लिए स्थानीय रिपॉजिटरी में स्थापित करेगा। संशोधन के बिना, आप mvan साइट चला सकते हैं और फिर लक्ष्य / साइट में एक index.html फ़ाइल खोज सकते हैं जिसमें JavaDoc के लिंक और आपके स्रोत कोड के बारे में कुछ रिपोर्टें हैं।
बेशक, यह सबसे सरल संभव उदाहरण परियोजना है। एक परियोजना जिसमें केवल स्रोत कोड होता है और जो एक JAR का उत्पादन करता है। एक परियोजना जो मावेन सम्मेलनों का अनुसरण करती है और इसके लिए किसी निर्भरता या अनुकूलन की आवश्यकता नहीं होती है। यदि हम व्यवहार को अनुकूलित करना शुरू करना चाहते हैं, तो हमारा pom.xml आकार में बढ़ने जा रहा है, और सबसे बड़ी परियोजनाओं में आप बहुत जटिल मावेन पोम्स के संग्रह देख सकते हैं, जिसमें प्लगइन अनुकूलन और निर्भरता घोषणाओं का एक बड़ा हिस्सा है। लेकिन, यहां तक कि जब आपकी परियोजना की पीओएम फाइलें अधिक महत्वपूर्ण हो जाती हैं, तो वे चींटी का उपयोग करके एक समान आकार की परियोजना की बिल्ड फाइल से पूरी तरह से अलग तरह की जानकारी रखती हैं। मावेन पोम में घोषणाएँ शामिल हैं: "यह एक जार परियोजना है", और "स्रोत कोड src / main / java में है"। चींटी बिल्ड फ़ाइलों में स्पष्ट निर्देश होते हैं: "यह प्रोजेक्ट है", "src/main/java
"," javac
इस निर्देशिका के खिलाफ चलाएं "," इसमें परिणाम डालें target/classses
"," एक जार बनाएं .... से "आदि, जहां चींटी को प्रक्रिया के बारे में स्पष्ट होना था, मावेन के लिए" अंतर्निहित "कुछ था। कि बस पता था कि स्रोत कोड कहां था और इसे कैसे संसाधित किया जाना चाहिए।
उच्च-स्तरीय तुलना
इस उदाहरण में चींटी और मावेन के बीच अंतर? चींटी ...
कहां मावेन ...
mvn install
। इस कमांड ने मावेन को जीवनचक्र तक पहुंचने तक अनुक्रम चरणों की एक श्रृंखला निष्पादित करने के लिए कहा। जीवनचक्र के माध्यम से इस यात्रा के साइड-इफ़ेक्ट के रूप में, मावेन ने कई डिफ़ॉल्ट प्लगइन लक्ष्यों को अंजाम दिया, जो संकलन और एक JAR बनाने जैसे कार्य करते थे।आइवी के बारे में क्या?
सही है, इसलिए स्टीव लॉगरन जैसे किसी व्यक्ति ने उस तुलना और कॉल को बेईमानी से पढ़ा। वह इस बारे में बात करने जा रहा है कि कैसे जवाब पूरी तरह से इवी नामक कुछ चीज़ों को नजरअंदाज करता है और यह तथ्य कि चींटी चींटी के हालिया रिलीज में तर्क का निर्माण कर सकती है। यह सच है। यदि आपके पास Ant + antlibs + Ivy का उपयोग करने वाले स्मार्ट लोगों का एक समूह है, तो आप एक अच्छी तरह से डिज़ाइन किए गए बिल्ड के साथ काम करेंगे। हालांकि, मैं बहुत आश्वस्त हूं कि मावेन समझ में आता है, मैं खुशी से चींटी + आईवी का उपयोग एक परियोजना टीम के साथ करूंगा जिसमें बहुत तेज निर्माण इंजीनियर था। कहा जा रहा है, मुझे लगता है कि आप जेट्टी प्लगइन जैसे कई मूल्यवान प्लगइन्स को याद कर रहे हैं और आप काम का एक पूरा गुच्छा समाप्त कर लेंगे जिसे आपको समय के साथ करने की आवश्यकता नहीं थी।
मावेन बनाम एंट से अधिक महत्वपूर्ण
मावेन एक फ्रेमवर्क है, चींटी एक टूलबॉक्स है
मावेन एक पूर्व-निर्मित सड़क कार है, जबकि चींटी कार भागों का एक सेट है। चींटी के साथ आपको अपनी कार बनानी होगी, लेकिन कम से कम अगर आपको कोई ऑफ-रोड ड्राइविंग करने की ज़रूरत है तो आप सही प्रकार की कार बना सकते हैं।
इसे दूसरे तरीके से रखने के लिए, मावेन एक ढांचा है जबकि चींटी एक टूलबॉक्स है। यदि आप ढांचे के दायरे में काम करने में संतुष्ट हैं तो मावेन ठीक काम करेंगे। मेरे लिए समस्या यह थी कि मैं ढांचे की सीमा में टकराता रहा और यह मुझे बाहर नहीं जाने देता था।
XML वर्बोसिटी
टोब्रियन एक लड़का है जो मावेन के बारे में बहुत कुछ जानता है और मुझे लगता है कि उसने दो उत्पादों की बहुत अच्छी, ईमानदार तुलना की। उन्होंने एक साधारण मावेन pom.xml की तुलना एक साधारण चींटी बिल्ड फ़ाइल के साथ की और उन्होंने उल्लेख किया कि मावेन परियोजनाएं और अधिक जटिल कैसे हो सकती हैं। मुझे लगता है कि इसके लायक कुछ फाइलों की तुलना पर एक नज़र डालते हैं जिन्हें आप एक साधारण वास्तविक दुनिया परियोजना में देखने की अधिक संभावना रखते हैं। नीचे दी गई फाइलें मल्टी-मॉड्यूल बिल्ड में एकल मॉड्यूल का प्रतिनिधित्व करती हैं।
सबसे पहले, मावेन फ़ाइल:
<project
xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-4_0_0.xsd">
<parent>
<groupId>com.mycompany</groupId>
<artifactId>app-parent</artifactId>
<version>1.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>persist</artifactId>
<name>Persistence Layer</name>
<dependencies>
<dependency>
<groupId>com.mycompany</groupId>
<artifactId>common</artifactId>
<scope>compile</scope>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>com.mycompany</groupId>
<artifactId>domain</artifactId>
<scope>provided</scope>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate</artifactId>
<version>${hibernate.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
<version>${commons-lang.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring</artifactId>
<version>${spring.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.dbunit</groupId>
<artifactId>dbunit</artifactId>
<version>2.2.3</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>${testng.version}</version>
<scope>test</scope>
<classifier>jdk15</classifier>
</dependency>
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
<version>${commons-dbcp.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.oracle</groupId>
<artifactId>ojdbc</artifactId>
<version>${oracle-jdbc.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.easymock</groupId>
<artifactId>easymock</artifactId>
<version>${easymock.version}</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
और समकक्ष चींटी फ़ाइल:
<project name="persist" >
<import file="../build/common-build.xml" />
<path id="compile.classpath.main">
<pathelement location="${common.jar}" />
<pathelement location="${domain.jar}" />
<pathelement location="${hibernate.jar}" />
<pathelement location="${commons-lang.jar}" />
<pathelement location="${spring.jar}" />
</path>
<path id="compile.classpath.test">
<pathelement location="${classes.dir.main}" />
<pathelement location="${testng.jar}" />
<pathelement location="${dbunit.jar}" />
<pathelement location="${easymock.jar}" />
<pathelement location="${commons-dbcp.jar}" />
<pathelement location="${oracle-jdbc.jar}" />
<path refid="compile.classpath.main" />
</path>
<path id="runtime.classpath.test">
<pathelement location="${classes.dir.test}" />
<path refid="compile.classpath.test" />
</path>
</project>
टोब्रियन ने अपने उदाहरण का उपयोग यह दिखाने के लिए किया कि मावेन ने अंतर्विरोधों का निर्माण किया है लेकिन इसका मतलब यह नहीं है कि आप कम एक्सएमएल लिखना कम कर दें। मैंने विपरीत को सच पाया है। Pom.xml, build.xml की तुलना में 3 गुना अधिक लंबी है और जो कि सम्मेलनों से भटक रही है। वास्तव में, मेरे मावेन उदाहरण को अतिरिक्त 54 लाइनों के बिना दिखाया गया है जो प्लगइन्स को कॉन्फ़िगर करने के लिए आवश्यक थे। वह pom.xml एक साधारण प्रोजेक्ट के लिए है। एक्सएमएल वास्तव में काफी बढ़ने लगता है जब आप अतिरिक्त आवश्यकताओं में जोड़ना शुरू करते हैं, जो कई परियोजनाओं के लिए सामान्य से बाहर नहीं है।
लेकिन आपको चींटी को बताना होगा कि क्या करना है
ऊपर मेरा चींटी उदाहरण बिल्कुल पूरा नहीं है। हमें अभी भी सफाई, संकलन, परीक्षण आदि के लिए निर्धारित लक्ष्यों को परिभाषित करना है। ये एक सामान्य बिल्ड फ़ाइल में परिभाषित किए गए हैं जो मल्टी-मॉड्यूल प्रोजेक्ट में सभी मॉड्यूल द्वारा आयात किया जाता है। जो मुझे इस बात की ओर ले जाता है कि चींटी में यह सब कैसे स्पष्ट रूप से लिखा जाना चाहिए जबकि यह मावेन में घोषणात्मक है।
अगर मैं इन चींटी लक्ष्यों को स्पष्ट रूप से लिखना नहीं चाहता, तो यह सच है, इससे मुझे समय की बचत होगी। लेकिन कितना समय? आम बिल्ड फ़ाइल जो मैं अब उपयोग करता हूं वह एक है जिसे मैंने 5 साल पहले लिखा था, तब से केवल मामूली शोधन के साथ। मावेन के साथ मेरे 2 साल के प्रयोग के बाद, मैंने पुरानी एंट बिल्ड फ़ाइल को कोठरी से बाहर निकाला, इसे धूल से उड़ा दिया और इसे वापस काम पर रख दिया। मेरे लिए, चींटी को स्पष्ट रूप से यह बताने की लागत कि 5 साल की अवधि में एक सप्ताह से भी कम समय तक क्या करना है।
जटिलता
अगला मुख्य अंतर जो मैं उल्लेख करना चाहता हूं, वह है जटिलता और वास्तविक-विश्व प्रभाव। मावेन का निर्माण प्रक्रियाओं के निर्माण और प्रबंधन के साथ काम करने वाले डेवलपर्स के काम के बोझ को कम करने के इरादे से किया गया था। ऐसा करने के लिए इसे जटिल बनाना होगा। दुर्भाग्य से यह जटिलता उनके इच्छित लक्ष्य को नकार देती है।
जब चींटी के साथ तुलना की जाती है, तो मावेन परियोजना पर बिल्ड आदमी अधिक समय बिताएगा:
इसके विपरीत:
सुपरिचय
एक और अंतर परिचित का है। नए डेवलपर्स को गति प्राप्त करने के लिए हमेशा समय की आवश्यकता होती है। मौजूदा उत्पादों से परिचित उस संबंध में मदद करता है और मावेन समर्थकों का दावा है कि यह मावेन का एक लाभ है। बेशक, चींटी के लचीलेपन का मतलब है कि आप जो चाहें सम्मेलनों को बना सकते हैं। तो मैं जिस कन्वेंशन का उपयोग करता हूं, वह मेरे स्रोत की फाइलों को एक निर्देशिका नाम src / main / java में रखना है। मेरी संकलित कक्षाएं लक्ष्य / कक्षाओं नामक एक निर्देशिका में जाती हैं। परिचित लगता है यह नहीं है।
मुझे मावेन द्वारा उपयोग की जाने वाली निर्देशिका संरचना पसंद है। मुझे लगता है कि यह समझ में आता है। इसके अलावा उनके जीवन चक्र का निर्माण। तो मैं अपने चींटी के निर्माण में समान सम्मेलनों का उपयोग करता हूं। सिर्फ इसलिए नहीं कि यह समझ में आता है बल्कि इसलिए क्योंकि यह पहले से ही मावेन का उपयोग करने वाले किसी भी व्यक्ति से परिचित होगा।
pom.xml
एस में ब्लोट से बचने के लिए , मैं उनमें से अधिकांश को XSLT के माध्यम से उत्पन्न करता हूं।
चींटी मुख्य रूप से एक निर्माण उपकरण है।
मावेन एक परियोजना और निर्भरता प्रबंधन उपकरण है (जो निश्चित रूप से आपकी परियोजना भी बनाता है)।
यदि आप मावेन से बचना चाहते हैं तो एंट + आइवी एक बहुत अच्छा संयोजन है।
बस कुछ और अंतरों को सूचीबद्ध करने के लिए:
अपडेट करें:
यह मावेन: द डेफिनिटिव गाइड से आया है । क्षमा करें, मैं इसे उद्धृत करना पूरी तरह से भूल गया।
मावेन या चींटी? यह एक बहुत ही समान प्रश्न है, जिससे आपको अपने प्रश्नों के उत्तर देने में मदद मिलेगी।
मावेन क्या है? आधिकारिक साइट पर।
संपादित करें: एक नए / ग्रीनफील्ड प्रोजेक्ट के लिए, मैं मावेन का उपयोग करने की सलाह दूंगा: "कॉन्फ़िगरेशन पर कन्वेंशन" आपको निर्माण और तैनाती स्क्रिप्ट लिखने और स्थापित करने में समय का एक अच्छा हिस्सा बचाएगा। जब आप चींटी का उपयोग करते हैं, तो बिल्ड स्क्रिप्ट लंबाई और जटिलता में समय के साथ विकसित होती है। मौजूदा परियोजनाओं के लिए, मावेन प्रणाली में उनके विन्यास / लेआउट को बनाना मुश्किल हो सकता है।
मावेन एक निर्भरता प्रबंधन उपकरण के रूप में कार्य करता है - इसका उपयोग जार को केंद्रीय भंडार से या आपके द्वारा सेट किए गए भंडार से - और एक घोषणात्मक निर्माण उपकरण के रूप में किया जा सकता है। एक "डिक्लेरेटिव" बिल्ड टूल और अधिक पारंपरिक एक जैसे चींटी या मेक के बीच का अंतर यह है कि आप कॉन्फ़िगर करते हैं कि क्या करने की आवश्यकता है, न कि कैसे किया जाता है। उदाहरण के लिए, आप एक मावेन स्क्रिप्ट में कह सकते हैं कि एक परियोजना को WAR फ़ाइल के रूप में पैक किया जाना चाहिए, और मावेन जानता है कि उसे कैसे संभालना है।
मावेन सम्मेलनों पर निर्भर करता है कि कैसे परियोजना निर्देशिकाओं को "घोषणा" प्राप्त करने के लिए निर्धारित किया जाता है। उदाहरण के लिए, इसमें आपके मुख्य कोड को रखने के लिए एक सम्मलेन होता है, जहाँ आप अपना web.xml, अपनी यूनिट का परीक्षण, और इसी तरह से डाल सकते हैं, लेकिन यदि आपको ज़रूरत हो तो उन्हें बदलने की क्षमता भी प्रदान करता है।
आपको यह भी ध्यान रखना चाहिए कि मावेन के भीतर से चींटी कमांड चलाने के लिए एक प्लगइन है:
http://maven.apache.org/plugins/maven-ant-plugin/
इसके अलावा, मावेन की चापलूसी वास्तव में तेजी से एक परियोजना के साथ शुरू हो रही है। उदाहरण के लिए, एक विकेट आर्कहाइप है, जो एक मावेन कमांड प्रदान करता है जिसे आप एक संपूर्ण, रेडी-टू-रन हेलो वर्ल्ड-टाइप प्रोजेक्ट प्राप्त करने के लिए चलाते हैं।
मैं एक ऐसे व्यक्ति को ले जा सकता हूं जिसने कभी चींटी को नहीं देखा है - इसके कारण build.xml
यथोचित लिखे गए हैं - और वे समझ सकते हैं कि क्या चल रहा है। मैं उसी व्यक्ति को ले जा सकता हूं और उन्हें एक मावेन पोम दिखा सकता हूं और उन्हें कुछ भी पता नहीं होगा कि क्या चल रहा है।
एक इंजीनियरिंग संगठन जो बहुत बड़ा है, में लोग चींटी फ़ाइलों के बड़े और असहनीय होने के बारे में लिखते हैं। मैंने उन प्रकारों को लिखा है और स्वच्छ चींटी लिपियों को लिखा है। यह वास्तव में आगे समझ रहा है कि आपको आगे बढ़ने और टेम्पलेट के एक सेट को डिजाइन करने की आवश्यकता है जो 3+ वर्ष की अवधि में परिवर्तन और पैमाने पर प्रतिक्रिया दे सकता है।
जब तक आपके पास एक सरल परियोजना नहीं है, मावेन सम्मेलनों को सीखना और मावेन तरीके से चीजों को प्राप्त करना काफी काम है।
दिन के अंत में आप चींटी या मावेन के साथ प्रोजेक्ट स्टार्टअप पर विचार नहीं कर सकते हैं: यह वास्तव में स्वामित्व की कुल लागत है। संगठन को कुछ वर्षों में अपनी निर्माण प्रणाली को बनाए रखने और विस्तारित करने के लिए क्या करना चाहिए, मुख्य कारकों में से एक है, जिस पर विचार किया जाना चाहिए।
एक बिल्ड सिस्टम के सबसे महत्वपूर्ण पहलू निर्भरता प्रबंधन और बिल्ड नुस्खा को व्यक्त करने में लचीलापन हैं। अच्छा होने पर यह कुछ हद तक सहज होना चाहिए।
मैं कहता हूं कि यह आपके प्रोजेक्ट के आकार पर निर्भर करता है ... व्यक्तिगत रूप से, मैं सरल परियोजनाओं के लिए मावेन का उपयोग करता हूं जिन्हें सीधे संकलन, पैकेजिंग और तैनाती की आवश्यकता होती है। जैसे ही आपको कुछ और जटिल चीजें करने की ज़रूरत होती है (कई निर्भरताएं, मैपिंग फ़ाइलें बनाना ...), मैं चींटी पर स्विच कर दूंगा ...
मावेन में आमतौर पर उपयोग किए जाने वाले ओपन सोर्स प्रोजेक्ट्स का एक बड़ा भंडार भी है। निर्माण के दौरान मावेन परियोजना के निर्माण के इस हिस्से को थोड़ा और प्रबंधनीय बनाने के लिए आपके लिए (साथ ही साथ आपकी निर्भरता निर्भरता :)) इन निर्भरताओं को डाउनलोड कर सकता है।