चींटी और मावेन के बीच अंतर [बंद]


180

क्या कोई मुझे चींटी और मावेन के बीच का अंतर बता सकता है? मैंने कभी इस्तेमाल नहीं किया। मैं समझता हूं कि वे जावा परियोजनाओं के निर्माण को स्वचालित करने के लिए उपयोग किए जाते हैं, लेकिन मुझे नहीं पता कि कहां से शुरू करना है।


4
चूंकि जवाब मावेन अधिवक्ताओं का प्रभुत्व है, इसलिए मैं इसे थोड़ा संतुलित करना चाहूंगा। इस उत्तर को उदाहरण के लिए देखें stackoverflow.com/questions/1306579/…
पेट्र ग्लैडिक्ख

4
हालांकि यह सीधे तौर पर एंट बनाम मावेन की तुलना करने के सवाल का जवाब नहीं देता है, मेरा इनपुट ग्रैडल का उपयोग करने पर होगा, जो आपको एंट और मावेन दोनों को एक साथ एक्सेस दे सकता है। gradle.org

जवाबों:


218

में 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"," एक जार बनाएं .... से "आदि, जहां चींटी को प्रक्रिया के बारे में स्पष्ट होना था, मावेन के लिए" अंतर्निहित "कुछ था। कि बस पता था कि स्रोत कोड कहां था और इसे कैसे संसाधित किया जाना चाहिए।

उच्च-स्तरीय तुलना

इस उदाहरण में चींटी और मावेन के बीच अंतर? चींटी ...

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

कहां मावेन ...

  • कन्वेंशन है, यह पहले से ही जानता था कि आपका स्रोत कोड कहां था क्योंकि आपने सम्मेलन का पालन किया था। इसने bytecode को लक्ष्य / कक्षाओं में रखा, और इसने लक्ष्य में एक JAR फ़ाइल का निर्माण किया।
  • घोषणात्मक है। आपको बस एक pom.xml फ़ाइल बनानी थी और अपने स्रोत को डिफ़ॉल्ट निर्देशिका में रखना था। मावेन ने आराम का ध्यान रखा।
  • एक जीवनचक्र है, जिसे आपने निष्पादित करते समय लागू किया था mvn install। इस कमांड ने मावेन को जीवनचक्र तक पहुंचने तक अनुक्रम चरणों की एक श्रृंखला निष्पादित करने के लिए कहा। जीवनचक्र के माध्यम से इस यात्रा के साइड-इफ़ेक्ट के रूप में, मावेन ने कई डिफ़ॉल्ट प्लगइन लक्ष्यों को अंजाम दिया, जो संकलन और एक JAR बनाने जैसे कार्य करते थे।

आइवी के बारे में क्या?

सही है, इसलिए स्टीव लॉगरन जैसे किसी व्यक्ति ने उस तुलना और कॉल को बेईमानी से पढ़ा। वह इस बारे में बात करने जा रहा है कि कैसे जवाब पूरी तरह से इवी नामक कुछ चीज़ों को नजरअंदाज करता है और यह तथ्य कि चींटी चींटी के हालिया रिलीज में तर्क का निर्माण कर सकती है। यह सच है। यदि आपके पास Ant + antlibs + Ivy का उपयोग करने वाले स्मार्ट लोगों का एक समूह है, तो आप एक अच्छी तरह से डिज़ाइन किए गए बिल्ड के साथ काम करेंगे। हालांकि, मैं बहुत आश्वस्त हूं कि मावेन समझ में आता है, मैं खुशी से चींटी + आईवी का उपयोग एक परियोजना टीम के साथ करूंगा जिसमें बहुत तेज निर्माण इंजीनियर था। कहा जा रहा है, मुझे लगता है कि आप जेट्टी प्लगइन जैसे कई मूल्यवान प्लगइन्स को याद कर रहे हैं और आप काम का एक पूरा गुच्छा समाप्त कर लेंगे जिसे आपको समय के साथ करने की आवश्यकता नहीं थी।

मावेन बनाम एंट से अधिक महत्वपूर्ण

  1. क्या आप सॉफ़्टवेयर कलाकृतियों का ट्रैक रखने के लिए एक रिपॉजिटरी मैनेजर का उपयोग करते हैं। मैं नेक्सस डाउनलोड करने का सुझाव दूंगा । आप नेक्सस को प्रॉक्सी रिमोट रिपॉजिटरी में इस्तेमाल कर सकते हैं और आंतरिक कलाकृतियों को तैनात करने के लिए अपनी टीम को जगह प्रदान कर सकते हैं।
  2. आपके पास सॉफ्टवेयर घटकों का उपयुक्त मॉडर्नाइजेशन है। एक बड़ा अखंड घटक शायद ही कभी समय के साथ बढ़ता है। जैसे ही आपकी परियोजना विकसित होती है, आप मॉड्यूल और उप-मॉड्यूल की अवधारणा चाहते हैं। मावेन इस दृष्टिकोण के लिए खुद को बहुत अच्छी तरह से उधार देता है।
  3. आप अपने निर्माण के लिए कुछ सम्मेलनों को अपनाते हैं। यहां तक ​​कि अगर आप चींटी का उपयोग करते हैं, तो आपको कुछ प्रकार के सम्मेलन को अपनाने का प्रयास करना चाहिए जो अन्य परियोजनाओं के अनुरूप है। जब कोई प्रोजेक्ट मावेन का उपयोग करता है, तो इसका मतलब है कि मावेन से परिचित कोई भी व्यक्ति निर्माण कर सकता है और इसके साथ दौड़ना शुरू कर सकता है, बिना कॉन्फ़िगरेशन के फिडेल के बिना बस यह पता लगाने के लिए कि कैसे संकलन करने के लिए चीज़ प्राप्त की जाए।

1
लिंक फिर से टूट गए हैं।
२०

1
मैं किसी भी ट्यूनिंग (Netbeans सम्मेलनों?) के बिना डिफ़ॉल्ट रूप से नेबियंस और चींटी कार्यों का उपयोग करता हूं। वर्तमान में मावेन की कोशिश कर रहा है और पहले बिल्ड और लगातार इंटरनेट कनेक्शन का उपयोग करने के दौरान इसे और अधिक लंबा लगता है। ऑफ़लाइन निर्माण संभवतः असंभव है। यह असहज है।
ज़ॉन

113

मावेन एक फ्रेमवर्क है, चींटी एक टूलबॉक्स है

मावेन एक पूर्व-निर्मित सड़क कार है, जबकि चींटी कार भागों का एक सेट है। चींटी के साथ आपको अपनी कार बनानी होगी, लेकिन कम से कम अगर आपको कोई ऑफ-रोड ड्राइविंग करने की ज़रूरत है तो आप सही प्रकार की कार बना सकते हैं।

इसे दूसरे तरीके से रखने के लिए, मावेन एक ढांचा है जबकि चींटी एक टूलबॉक्स है। यदि आप ढांचे के दायरे में काम करने में संतुष्ट हैं तो मावेन ठीक काम करेंगे। मेरे लिए समस्या यह थी कि मैं ढांचे की सीमा में टकराता रहा और यह मुझे बाहर नहीं जाने देता था।

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 साल की अवधि में एक सप्ताह से भी कम समय तक क्या करना है।

जटिलता

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

जब चींटी के साथ तुलना की जाती है, तो मावेन परियोजना पर बिल्ड आदमी अधिक समय बिताएगा:

  • पढ़ना प्रलेखन: मावेन पर बहुत अधिक प्रलेखन है, क्योंकि आपको सीखने के लिए बहुत कुछ है।
  • टीम के सदस्यों को शिक्षित करना: वे किसी ऐसे व्यक्ति से पूछना आसान समझते हैं जो स्वयं जवाब खोजने की कोशिश करने के बजाय जानता है।
  • बिल्ड का समस्या निवारण: मावेन चींटी की तुलना में कम विश्वसनीय है, विशेष रूप से गैर-कोर प्लगइन्स। इसके अलावा, मावेन बिल्ड्स दोहराए जाने योग्य नहीं हैं। यदि आप एक प्लगइन के SNAPSHOT संस्करण पर निर्भर करते हैं, जो बहुत संभावना है, तो आपका निर्माण बिना कुछ बदले आपके टूट सकता है।
  • मावेन प्लगइन्स लिखना: प्लगइन्स आमतौर पर एक विशिष्ट कार्य को ध्यान में रखकर लिखे जाते हैं, उदाहरण के लिए एक वेबस्टार्ट बंडल बनाएं, जो अन्य कार्यों के लिए उन्हें पुन: उपयोग करना या लक्ष्य प्राप्त करने के लिए उन्हें संयोजित करना अधिक कठिन बनाता है। तो आपको मौजूदा प्लगइन सेट में वर्कअराउंड अंतराल के लिए अपना खुद का एक लिखना होगा।

इसके विपरीत:

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

सुपरिचय

एक और अंतर परिचित का है। नए डेवलपर्स को गति प्राप्त करने के लिए हमेशा समय की आवश्यकता होती है। मौजूदा उत्पादों से परिचित उस संबंध में मदद करता है और मावेन समर्थकों का दावा है कि यह मावेन का एक लाभ है। बेशक, चींटी के लचीलेपन का मतलब है कि आप जो चाहें सम्मेलनों को बना सकते हैं। तो मैं जिस कन्वेंशन का उपयोग करता हूं, वह मेरे स्रोत की फाइलों को एक निर्देशिका नाम src / main / java में रखना है। मेरी संकलित कक्षाएं लक्ष्य / कक्षाओं नामक एक निर्देशिका में जाती हैं। परिचित लगता है यह नहीं है।

मुझे मावेन द्वारा उपयोग की जाने वाली निर्देशिका संरचना पसंद है। मुझे लगता है कि यह समझ में आता है। इसके अलावा उनके जीवन चक्र का निर्माण। तो मैं अपने चींटी के निर्माण में समान सम्मेलनों का उपयोग करता हूं। सिर्फ इसलिए नहीं कि यह समझ में आता है बल्कि इसलिए क्योंकि यह पहले से ही मावेन का उपयोग करने वाले किसी भी व्यक्ति से परिचित होगा।


7
मुझे वास्तव में पसंद है कि आप मावेन के विचारों को कैसे चुराते हैं और उन्हें आम सम्मेलनों का पालन करने के लिए अपने एंट बिल्ड पर लागू करते हैं और दूसरों के लिए संक्रमण आसान बनाते हैं।
इगोर 40ordaš

pom.xmlएस में ब्लोट से बचने के लिए , मैं उनमें से अधिकांश को XSLT के माध्यम से उत्पन्न करता हूं।
डेमी

21

चींटी मुख्य रूप से एक निर्माण उपकरण है।

मावेन एक परियोजना और निर्भरता प्रबंधन उपकरण है (जो निश्चित रूप से आपकी परियोजना भी बनाता है)।

यदि आप मावेन से बचना चाहते हैं तो एंट + आइवी एक बहुत अच्छा संयोजन है।


यह। Ant + Ivy और Maven2 के बीच तुलना यहाँ: ant.apache.org/ivy/m2comparison.html
Esko

आप मावेन से बचना क्यों चाहेंगे? मावेन, मेरे अनुभव में, जावा विकास के कुछ हिस्सों में से एक है जो सुखद है।
बेन्सन

4
@ बेन्सन: यह एक विवादास्पद मुद्दा है। अगर यह चांदी की गोली होती तो हर कोई इसका उपयोग कर रहा होता।
चेरोविम

18

बस कुछ और अंतरों को सूचीबद्ध करने के लिए:

  • चींटी के पास औपचारिक सम्मेलन नहीं हैं। आपको चींटी को बताना होगा कि स्रोत को कहां खोजना है, कहां से आउटपुट डालना है, आदि।
  • चींटी प्रक्रियात्मक है। आपको चींटी को बताना है कि वास्तव में क्या करना है; इसे संकलित करना, प्रतिलिपि बनाना, फिर संपीड़ित करना, आदि।
  • चींटी के पास जीवनचक्र नहीं है।
  • मावेन सम्मेलनों का उपयोग करता है। यह जानता है कि जब तक आप इन सम्मेलनों का अनुसरण करते हैं, तब तक आपका स्रोत कोड स्वचालित रूप से कहां होता है। आपको मावेन को यह बताने की ज़रूरत नहीं है कि वह कहाँ है।
  • मावेन घोषणात्मक है; आपको बस एक pom.xml फ़ाइल बनानी है और अपने स्रोत को डिफ़ॉल्ट निर्देशिका में रखना है। मावेन बाकी की देखभाल करेगा।
  • मावेन के पास एक जीवनचक्र है। आप बस mvan इंस्टॉल कहते हैं और अनुक्रम चरणों की एक श्रृंखला निष्पादित होती है।
  • मावेन के पास सामान्य परियोजना कार्यों के बारे में खुफिया जानकारी है। परीक्षण चलाने के लिए, सरल निष्पादन mvn परीक्षण , जब तक कि फाइलें डिफ़ॉल्ट स्थान पर हैं। चींटी में, आपको सबसे पहले JUnit JAR फाइल करनी होगी, फिर एक क्लासपैथ बनाएं जिसमें JUnit JAR शामिल हो, फिर चींटी को बताएं कि उसे टेस्ट सोर्स कोड कहां दिखना चाहिए, एक ऐसा लक्ष्य लिखें, जो टेस्ट सोर्स को कंपाइल करता है और फिर यूनिट टेस्ट को अंजाम देता है। जुनीत के साथ।

अपडेट करें:

यह मावेन: द डेफिनिटिव गाइड से आया है । क्षमा करें, मैं इसे उद्धृत करना पूरी तरह से भूल गया।


क्या वह एक वाक्य था?
वाकियो १io

1
@वाकियो - मैं आपको अनुमान लगाने जा रहा हूं क्योंकि मैंने "साइट" का उपयोग "काइट" के बजाय किया है? यह पूरी तरह से मेरी ओर से एक खराब वर्तनी थी और मैंने इसे ठीक कर दिया
एस्कालोनियन

17

मावेन या चींटी? यह एक बहुत ही समान प्रश्न है, जिससे आपको अपने प्रश्नों के उत्तर देने में मदद मिलेगी।

मावेन क्या है? आधिकारिक साइट पर।

संपादित करें: एक नए / ग्रीनफील्ड प्रोजेक्ट के लिए, मैं मावेन का उपयोग करने की सलाह दूंगा: "कॉन्फ़िगरेशन पर कन्वेंशन" आपको निर्माण और तैनाती स्क्रिप्ट लिखने और स्थापित करने में समय का एक अच्छा हिस्सा बचाएगा। जब आप चींटी का उपयोग करते हैं, तो बिल्ड स्क्रिप्ट लंबाई और जटिलता में समय के साथ विकसित होती है। मौजूदा परियोजनाओं के लिए, मावेन प्रणाली में उनके विन्यास / लेआउट को बनाना मुश्किल हो सकता है।


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

मुझे लगता है कि विधानसभा प्लगइन क्या करता है यह पूरा करना इतना आसान है कि यह मावेन प्रारूप (जहां आप xml प्रारूप में विधानसभा के मॉडल को बाहर करते हैं) में चींटी के मैनुअल चरणों के सभी करने की तुलना में, लेकिन YMMV
मैट बी

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

3
पहला लिंक अब मृत है: /
मैट क्लार्क

15

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

मावेन सम्मेलनों पर निर्भर करता है कि कैसे परियोजना निर्देशिकाओं को "घोषणा" प्राप्त करने के लिए निर्धारित किया जाता है। उदाहरण के लिए, इसमें आपके मुख्य कोड को रखने के लिए एक सम्मलेन होता है, जहाँ आप अपना web.xml, अपनी यूनिट का परीक्षण, और इसी तरह से डाल सकते हैं, लेकिन यदि आपको ज़रूरत हो तो उन्हें बदलने की क्षमता भी प्रदान करता है।

आपको यह भी ध्यान रखना चाहिए कि मावेन के भीतर से चींटी कमांड चलाने के लिए एक प्लगइन है:

http://maven.apache.org/plugins/maven-ant-plugin/

इसके अलावा, मावेन की चापलूसी वास्तव में तेजी से एक परियोजना के साथ शुरू हो रही है। उदाहरण के लिए, एक विकेट आर्कहाइप है, जो एक मावेन कमांड प्रदान करता है जिसे आप एक संपूर्ण, रेडी-टू-रन हेलो वर्ल्ड-टाइप प्रोजेक्ट प्राप्त करने के लिए चलाते हैं।

https://wicket.apache.org/start/quickstart.html


11

मैं एक ऐसे व्यक्ति को ले जा सकता हूं जिसने कभी चींटी को नहीं देखा है - इसके कारण build.xmlयथोचित लिखे गए हैं - और वे समझ सकते हैं कि क्या चल रहा है। मैं उसी व्यक्ति को ले जा सकता हूं और उन्हें एक मावेन पोम दिखा सकता हूं और उन्हें कुछ भी पता नहीं होगा कि क्या चल रहा है।

एक इंजीनियरिंग संगठन जो बहुत बड़ा है, में लोग चींटी फ़ाइलों के बड़े और असहनीय होने के बारे में लिखते हैं। मैंने उन प्रकारों को लिखा है और स्वच्छ चींटी लिपियों को लिखा है। यह वास्तव में आगे समझ रहा है कि आपको आगे बढ़ने और टेम्पलेट के एक सेट को डिजाइन करने की आवश्यकता है जो 3+ वर्ष की अवधि में परिवर्तन और पैमाने पर प्रतिक्रिया दे सकता है।

जब तक आपके पास एक सरल परियोजना नहीं है, मावेन सम्मेलनों को सीखना और मावेन तरीके से चीजों को प्राप्त करना काफी काम है।

दिन के अंत में आप चींटी या मावेन के साथ प्रोजेक्ट स्टार्टअप पर विचार नहीं कर सकते हैं: यह वास्तव में स्वामित्व की कुल लागत है। संगठन को कुछ वर्षों में अपनी निर्माण प्रणाली को बनाए रखने और विस्तारित करने के लिए क्या करना चाहिए, मुख्य कारकों में से एक है, जिस पर विचार किया जाना चाहिए।

एक बिल्ड सिस्टम के सबसे महत्वपूर्ण पहलू निर्भरता प्रबंधन और बिल्ड नुस्खा को व्यक्त करने में लचीलापन हैं। अच्छा होने पर यह कुछ हद तक सहज होना चाहिए।


6

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


मैं असहमत हूं। मैं सहमत हूं कि सरल परियोजनाओं के लिए मावेन का उपयोग करना अच्छा है, लेकिन मैं तर्क देता हूं कि परिमाण के आदेशों से मावेन वृद्धि का उपयोग करने से आपके लाभों में वृद्धि हुई है।
बेन्सन

मैं भी असहमत हूं, मावेन वास्तव में अच्छी तरह से काम करना शुरू कर देता है जब आपके पास कई परस्पर संबंधित मॉड्यूल के साथ एक अधिक जटिल प्रणाली होती है। यदि आपको कार्यात्मक परीक्षण लिखने, रिपोर्ट चलाने, और एक रिपॉजिटरी प्रबंधक के लिए कलाकृतियों को तैनात करने की आवश्यकता है, तो आप अपने आप को चींटी के साथ क्यों करेंगे?
टिम ओ'ब्रायन ने

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

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

4

मावेन में आमतौर पर उपयोग किए जाने वाले ओपन सोर्स प्रोजेक्ट्स का एक बड़ा भंडार भी है। निर्माण के दौरान मावेन परियोजना के निर्माण के इस हिस्से को थोड़ा और प्रबंधनीय बनाने के लिए आपके लिए (साथ ही साथ आपकी निर्भरता निर्भरता :)) इन निर्भरताओं को डाउनलोड कर सकता है।


2
+1, यह देखते हुए कि सेंट्रल मावेन रिपॉजिटरी को चालू रखने के लिए उसे क्या करना है, मुझे इसमें झंकार करना होगा और सुझाव देना होगा कि मावेन और आइवी जैसी किसी भी चीज़ का उपयोग करने वाले प्रत्येक व्यक्ति को रिपॉजिटरी मैनेजर स्थापित करने पर विचार करना चाहिए। इससे कोई फर्क नहीं पड़ता कि कौन सा है, लेकिन मैं नेक्सस nexus.sonatype.org पर आंशिक हूं
टिम ओ'ब्रायन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.