Karınca ve Maven arasındaki farklar [kapalı]


180

Birisi bana Ant ve Maven arasındaki farkları söyleyebilir mi? Ben de hiç kullanmadım. Java projelerinin oluşturulmasını otomatikleştirmek için kullanıldıklarını anlıyorum, ancak nereden başlayacağımı bilmiyorum.


4
Cevaplar Maven savunucuları tarafından yönetildiği için biraz dengede tutmak istiyorum. Bu cevaba bakınız, örneğin stackoverflow.com/questions/1306579/…
Petr Gladkikh

4
Bu, Ant ve Maven'i karşılaştırma sorusuna doğrudan cevap vermese de, girdim Gradle'ı kullanmaya bakmaktır, bu da hem Ant hem de Maven'e aynı anda erişmenizi sağlayabilir. gradle.org

Yanıtlar:


218

In Maven: Kesin Kılavuzu , ben bölüm başlığı girişte Maven Karınca'daki arasındaki farklar hakkında yazdığı "Ant ve Maven Arasındaki Farklar" . İşte o girişteki bilgilerin bazı ek notlarla birleşiminden oluşan bir cevap.

Basit Bir Karşılaştırma

Bunu size sadece en temel düzeyde Maven'in yerleşik sözleşmeler olduğu fikrini göstermek için gösteriyorum. İşte basit bir Ant derleme dosyası:

<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>

Bu basit Ant örneğinde, Ant'e tam olarak ne yapacağını nasıl söylemeniz gerektiğini görebilirsiniz. Src / main / java dizinindeki kaynağı hedef / sınıflar dizinine derleyen javac görevini içeren bir derleme hedefi vardır. Ant'e tam olarak kaynağınızın nerede olduğunu, ortaya çıkan bayt kodunun nerede saklanmasını istediğinizi ve bunların tümünü bir JAR dosyasına nasıl paketleyeceğinizi söylemelisiniz. Ant'i daha az prosedürel hale getirmeye yardımcı olan bazı gelişmeler olsa da, bir geliştiricinin Ant ile olan deneyimi XML'de yazılmış bir prosedür dilini kodlamaktadır.

Önceki Ant örneğini Maven örneğiyle karşılaştır. Maven'de, bazı Java kaynaklarından bir JAR dosyası oluşturmak için tek yapmanız gereken basit bir pom.xml oluşturmak, kaynak kodunuzu $ {basedir} / src / main / java dizinine yerleştirmek ve ardından komut satırından mvn install komutunu çalıştırmaktır. . Aynı sonuçları veren Maven pom.xml örneği.

<project>
  <modelVersion>4.0.0</modelVersion>
  <groupId>org.sonatype.mavenbook</groupId>
  <artifactId>my-project</artifactId>
  <version>1.0</version>
</project>

Pom.xml dosyasında ihtiyacınız olan her şey budur. Mvn install komut satırından çalıştırıldığında, kaynaklar işlenir, kaynak derlenir, birim sınamaları yürütülür, JAR oluşturulur ve diğer projelerde yeniden kullanılmak üzere JAR'ı yerel bir depoya yüklenir. Değişiklik olmadan, mvn sitesini çalıştırabilir ve ardından JavaDoc'a bağlantılar ve kaynak kodunuzla ilgili birkaç rapor içeren bir index.html dosyası bulabilirsiniz.

Kuşkusuz, bu mümkün olan en basit örnek projedir. Yalnızca kaynak kodu içeren ve JAR üreten bir proje. Maven sözleşmelerini takip eden ve herhangi bir bağımlılık veya özelleştirme gerektirmeyen bir proje. Davranışı özelleştirmeye başlamak istiyorsak, pom.xml boyutumuz büyüyecek ve en büyük projelerde, çok sayıda eklenti özelleştirme ve bağımlılık bildirimi içeren çok karmaşık Maven POM koleksiyonlarını görebilirsiniz. Ancak, projenizin POM dosyaları daha önemli hale geldiğinde bile, Ant kullanarak benzer boyuttaki bir projenin derleme dosyasından tamamen farklı bir bilgi türüne sahiptirler. Maven POM'ları bildirimler içerir: "Bu bir JAR projesidir" ve "Kaynak kodu src / main / java'dadır". Ant derleme dosyaları açık talimatlar içerir: "Bu proje", "src/main/java"," javacBu dizine karşı çalıştır "," Sonuçları koy target/classses"," .... 'dan bir JAR oluşturun ", vb. Ant burada süreç hakkında açık olması gereken, Maven" yerleşik "bir şey vardı kaynak kodun nerede olduğunu ve nasıl işlenmesi gerektiğini biliyordu.

Üst Düzey Karşılaştırma

Bu örnekte Ant ve Maven arasındaki farklar nelerdir? Karınca...

  • ortak bir proje dizini yapısı gibi resmi kurallara sahip değilse, Ant'e tam olarak kaynağı nerede bulacağınızı ve çıktıyı nereye koyacağınızı söylemelisiniz. Zamanla gayri resmi sözleşmeler ortaya çıktı, ancak ürüne kodlanmadılar.
  • usule göre, Ant'e tam olarak ne yapacağını ve ne zaman yapacağını söylemelisin. Derlemesini, sonra kopyalamasını ve sıkıştırmasını söylemeliydin.
  • yaşam döngüsü yok, hedefler ve hedef bağımlılıkları tanımlamanız gerekiyordu. Her hedefe manuel olarak bir dizi görev eklemeniz gerekiyordu.

Nerede Maven ...

  • sözleşmeler varsa, sözleşmeyi izlediğiniz için kaynak kodunuzun nerede olduğunu zaten biliyordu. Bayt kodunu hedefe / sınıflara koydu ve hedefe bir JAR dosyası üretti.
  • bildirim niteliğindedir. Tek yapmanız gereken bir pom.xml dosyası oluşturmak ve kaynağınızı varsayılan dizine koymaktı. Maven gerisini halletti.
  • yürüttüğünüzde çağırdığınız bir yaşam döngüsü vardır mvn install. Bu komut Maven'e yaşam döngüsüne ulaşıncaya kadar bir dizi dizi adımı yürütmesini söyledi. Yaşam döngüsü boyunca bu yolculuğun bir yan etkisi olarak, Maven derleme ve JAR oluşturma gibi şeyleri yapan bir dizi varsayılan eklenti hedefi gerçekleştirdi.

Ivy ne olacak?

Evet, Steve Loughran gibi biri bu karşılaştırmayı okuyacak ve faul diyecektir. Cevabın Ivy adı verilen bir şeyi nasıl tamamen görmezden geldiği ve Ant'in Ant'in son sürümlerinde yeniden inşa mantığı kullanabileceği hakkında konuşacak. Bu doğru. Ant + antlibs + Ivy kullanan bir grup akıllı insanınız varsa, iyi çalışan bir yapıya sahip olursunuz. Maven'in mantıklı olduğuna ikna olmama rağmen, Ant + Ivy'yi çok keskin bir inşaat mühendisi olan bir proje ekibiyle mutlu bir şekilde kullanacağım. Bununla birlikte, Jetty eklentisi gibi bir dizi değerli eklentiyi kaçırıp zaman içinde yapmanız gerekmeyen bir sürü iş yapacağınızı düşünüyorum.

Maven ve Ant'den Daha Önemli

  1. Yazılım eserlerini takip etmek için bir Depo Yöneticisi mi kullanıyorsunuz? Nexus'u indirmenizi öneririm . Nexus'u uzak depoları proxy yapmak ve ekibinize dahili eserler dağıtması için bir yer sağlamak için kullanabilirsiniz.
  2. Yazılım bileşenlerini uygun şekilde modüle edebilirsiniz. Bir büyük monolitik bileşen zaman içinde nadiren ölçeklenir. Projeniz geliştikçe, modül ve alt modül kavramına sahip olmak isteyeceksiniz. Maven bu yaklaşıma çok iyi borç veriyor.
  3. Yapınız için bazı sözleşmeler kabul ediyorsunuz. Ant'i kullansanız bile, diğer projelerle tutarlı bir kongre biçimini benimsemeye çalışmalısınız. Bir proje Maven kullandığında, Maven'e aşina olan herkes, derlemeyi nasıl elde edeceğini anlamak için yapılandırmayla uğraşmadan yapıyı alabilir ve onunla çalışmaya başlayabilir.

1
Bağlantılar tekrar koptu.
Thunderforge

1
Nebeans ve Ant işlerini varsayılan olarak herhangi bir ayar yapmadan kullanıyorum (Netbeans kuralları?). Şu anda Maven'i deniyor ve ilk kurulumlarda ve sürekli internet bağlantısını kullanarak daha uzun buluyor. Çevrimdışı oluşturmak muhtemelen imkansızdır. Bu rahatsız edici.
Zon

113

Maven bir Framework, Ant bir Toolbox

Maven önceden oluşturulmuş bir yol otomobili, Ant ise bir dizi araba parçası. Ant ile kendi arabanızı yapmak zorundasınız, ancak en azından herhangi bir arazi sürüşü yapmanız gerekiyorsa, doğru araba türünü oluşturabilirsiniz.

Başka bir deyişle, Maven bir çerçeve iken Ant bir araç kutusu. Çerçevenin sınırları dahilinde çalışmaktan memnunsanız Maven iyi durumda olacaktır. Benim için sorun, çerçevenin sınırlarına çarpmaya devam etmemdi ve beni dışarı çıkarmayacaktı.

XML Ayrıntıları

tobrien, Maven hakkında çok şey bilen bir adam ve sanırım iki ürünün çok iyi ve dürüst bir karşılaştırmasını sağladı. Basit bir Maven pom.xml'yi basit bir Ant oluşturma dosyasıyla karşılaştırdı ve Maven projelerinin nasıl daha karmaşık olabileceğinden bahsetti. Basit bir gerçek dünya projesinde görmeniz daha muhtemel olan birkaç dosyayı karşılaştırmaya göz atmaya değer olduğunu düşünüyorum. Aşağıdaki dosyalar çok modüllü bir yapıdaki tek bir modülü temsil eder.

İlk olarak Maven dosyası:

<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>

Ve eşdeğer Ant dosyası:

<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>

tobrien, Maven'in yerleşik kurallara sahip olduğunu göstermek için örneğini kullandı ancak bu, daha az XML yazdığınız anlamına gelmez. Bunun tam tersini doğru buldum. Pom.xml, build.xml'den 3 kat daha uzundur ve bu kurallardan sapmaz. Aslında, Maven örneğim eklentileri yapılandırmak için gereken 54 satır olmadan gösteriliyor. Bu pom.xml basit bir proje içindir. Ekstra gereksinimler eklemeye başladığınızda XML gerçekten önemli ölçüde büyümeye başlar, bu da birçok proje için olağandışı değildir.

Ama Ant'e ne yapacağını söylemelisin

Yukarıdaki Ant örneğim elbette tam değil. Hala temizlemek, derlemek, test etmek vb. İçin kullanılan hedefleri tanımlamamız gerekir. Bunlar, çok modüllü projedeki tüm modüller tarafından içe aktarılan ortak bir derleme dosyasında tanımlanır. Bu da beni bütün bu şeylerin Ant'de nasıl açıkça yazılması gerektiğine, Maven'de ise açıklayıcı olmasına neden oluyor.

Doğru, bu Ant hedeflerini açıkça yazmak zorunda kalmazsam zaman kazandıracaktı. Ama ne kadar zaman? Şu anda kullandığım ortak yapı dosyası, 5 yıl önce o zamandan beri sadece hafif iyileştirmelerle yazdığım dosya. Maven ile yaptığım 2 yıllık deneyimin ardından, eski Ant yapı dosyasını dolaptan çıkardım, tozunu aldım ve tekrar işe koydum. Benim için, Ant'e ne yapacağını açık bir şekilde anlatmanın maliyeti, 5 yıllık bir süre boyunca bir haftadan az bir süre ekledi.

karmaşa

Bahsetmek istediğim bir sonraki büyük fark, karmaşıklık ve sahip olduğu gerçek dünya etkisidir. Maven, inşa süreçlerini yaratmak ve yönetmekle görevli geliştiricilerin iş yükünü azaltmak amacıyla inşa edildi. Bunu yapabilmek için karmaşık olması gerekir. Ne yazık ki bu karmaşıklık amaçlanan hedeflerini reddetme eğilimindedir.

Ant ile karşılaştırıldığında, Maven projesindeki yapı adamı daha fazla zaman harcayacak:

  • Belgeleri okuma: Maven hakkında çok daha fazla belge var, çünkü öğrenmeniz gereken çok daha fazla şey var.
  • Ekip üyelerini eğitmek: Cevapları kendileri bulmaya çalışmak yerine bilen birine sormayı daha kolay buluyorlar.
  • Derlemede sorun giderme: Maven, özellikle çekirdek olmayan eklentiler olan Ant'den daha az güvenilirdir. Ayrıca Maven yapıları tekrarlanamaz. Bir eklentinin SNAPSHOT sürümüne bağımlıysanız, büyük olasılıkla, derlemeniz hiçbir şey değiştirmeden kırılabilir.
  • Maven eklentileri yazma: Eklentiler genellikle belirli bir görev göz önünde bulundurularak yazılır, örneğin bir web başlangıç ​​paketi oluşturmak, bu da onları diğer görevler için yeniden kullanmayı veya bir hedefe ulaşmak için birleştirmeyi zorlaştırır. Bu nedenle, mevcut eklenti kümesindeki geçici boşluklara kendiniz yazmak zorunda kalabilirsiniz.

Tersine:

  • Ant dokümanları özlü, kapsamlı ve hepsi bir arada.
  • Karınca basit. Ant'i öğrenmeye çalışan yeni bir geliştiricinin, bilmeleri gereken diğer şeyleri anlayabilmek için sadece birkaç basit kavramı (hedefler, görevler, bağımlılıklar, özellikler) anlaması gerekir.
  • Karınca güvenilirdir. Ant, son birkaç yıldır çok fazla yayınlanmadı, çünkü zaten çalışıyor.
  • Karınca yapıları tekrarlanabilir çünkü genellikle çevrimiçi depolar, deneysel üçüncü taraf eklentileri gibi harici bağımlılıklar olmadan oluşturulurlar.
  • Karınca kapsamlı. Bu bir araç kutusu olduğundan, neredeyse istediğiniz her görevi gerçekleştirmek için araçları birleştirebilirsiniz. Kendi özel görevinizi yazmanız gerekiyorsa, bunu yapmak çok basittir.

Aşinalık

Başka bir fark, aşinalıktır. Yeni geliştiriciler hızlanmak için her zaman zamana ihtiyaç duyarlar. Mevcut ürünlere aşinalık bu konuda yardımcı olur ve Maven destekçileri haklı olarak bunun Maven'in bir yararı olduğunu iddia eder. Elbette, Ant'in esnekliği, istediğiniz her türlü sözleşmeyi oluşturabileceğiniz anlamına gelir. Bu yüzden kullandığım kural kaynak dosyalarımı src / main / java dizin adına koymaktır. Derlediğim sınıflarım target / classes adlı bir dizine giriyor. Tanıdık geliyor değil mi?

Maven'in kullandığı dizin yapısını seviyorum. Sanırım mantıklı. Ayrıca yapı yaşam döngüsü. Bu yüzden Ant yapılarımda da aynı kuralları kullanıyorum. Sadece mantıklı olduğu için değil, daha önce Maven'i kullanan herkese tanıdık geleceğinden.


7
Fikirleri Maven'den nasıl "Çaldığınızı" ve bunları ortak sözleşmeleri takip etmek ve başkaları için geçişi kolaylaştırmak için Ant yapılarınıza nasıl uyguladığınızı gerçekten seviyorum.
Igor Čordaš

Şişkinlikten kaçınmak için pom.xml, çoğunu XSLT ile üretiyorum.
Demi

21

Ant esas olarak bir yapı aracıdır.

Maven, bir proje ve bağımlılık yönetimi aracıdır (elbette projenizi de oluşturur).

Maven'den kaçınmak istiyorsanız Ant + Ivy oldukça iyi bir kombinasyon.


Bu. Ant + Ivy ve Maven2 arasındaki karşılaştırma burada: ant.apache.org/ivy/m2comparison.html
Esko

Neden Maven'den kaçınmak istersiniz? Maven, tecrübelerime göre, java gelişiminin hoş kısımlarından biri.
Benson

4
@Benson: Bu tartışmalı bir konu. Gümüş mermi olsaydı, herkes onu kullanırdı.
cherouvim

18

Bazı farklılıkları listelemek için:

  • Ant'in resmi kuralları yoktur. Ant'e tam olarak kaynağı nerede bulacağınızı, çıkışları nereye koyacağınızı vb. Söylemelisiniz.
  • Karınca prosedüreldir. Ant'e tam olarak ne yapacağını söylemelisin; derlemesini, kopyalamasını, sonra sıkıştırmasını vb.
  • Ant'in yaşam döngüsü yok.
  • Maven sözleşmeler kullanıyor. Bu kuralları izlediğiniz sürece kaynak kodunuzun otomatik olarak nerede olduğunu bilir. Maven'e nerede olduğunu söylemene gerek yok.
  • Maven bildiricidir; Tek yapmanız gereken bir pom.xml dosyası oluşturmak ve kaynağınızı varsayılan dizine koymaktır. Maven gerisini halleder.
  • Maven'in yaşam döngüsü var. Sadece mvn install'i çağırırsınız ve bir dizi dizi adım yürütülür.
  • Maven, ortak proje görevleri hakkında istihbarat sahibi. Testleri çalıştırmak için, dosyalar varsayılan konumda olduğu sürece basitçe mvn testini yürütün . Ant'de, önce JUnit JAR dosyası, daha sonra JUnit JAR'ı içeren bir sınıf yolu oluşturmanız, ardından Ant'e test kaynak kodunu nerede araması gerektiğini, test kaynağını derleyen bir hedef yazıp sonunda birim testlerini yürütmesi gerekir. JUnit ile.

Güncelleme:

Bu Maven: Kesin Rehber'den geldi . Üzgünüm, alıntı yapmayı tamamen unuttum.


Bu güncelleme bir yumruk muydu?
vakio

1
@vakio - "Cite" yerine "site" kullandığım için kastettiğini tahmin edeceğim? Bu benim için tamamen kötü bir yazım oldu ve ben bunu
düzeltdim

17

Maven veya Karınca? bu soruya çok benzer bir sorudur ve sorularınızı cevaplamanıza yardımcı olacaktır.

Maven nedir? resmi sitede.

edit: Yeni / yeşil alan projesi için Maven kullanmanızı tavsiye ederim: "yapılandırma konvansiyonu" yazma ve oluşturma ve dağıtım komut dosyaları kurma size zaman iyi bir yığın kaydeder. Ant kullandığınızda, derleme betiği zamanla ve karmaşıklıkta zamanla büyür. Mevcut projeler için, konfigürasyonlarını / düzenini Maven sistemine sokmak zor olabilir.


Maven, projenizin başında size zaman kazandıracak, ancak zaman içinde, çok basit bir projeden başka bir şeyiniz varsa, Maven senaryoları Ant eşdeğerinden çok daha karmaşık hale gelecektir. Örneğin, Maven Assembly eklentisine bakın.
Kevin Stembridge

Meclis eklentisinin ne yaptığını başarmanın Maven biçiminde (montaj modelini xml formatında düzenlediğiniz yerde) Ant'de tüm manuel adımları yapmaktan çok daha kolay olduğunu iddia ediyorum, ancak YMMV
matt b

Merhaba Matt, montaj eklentisi için öğrenme eğrisi Karınca katranı veya zip görevi için olandan çok daha diktir. Tanımlayıcı biçim 150 satır uzunluğundadır ve sezgisel olmayan bir dizi yapılandırma seçeneği içerir. Üstelik işe yaramıyor! Assembly eklentisinden vazgeçtiğim noktada, paketten çıkarmada filtreleme işe yaramadı ve dosya modu seçenekleri de işe yaramadı ve fixcrlf başarısız oldu. "Ant'deki tüm manuel adımlar" ile ne demek istediğinizden emin değilim. Saatlerce montaj eklentisini alamadığım şeyi yapmak için Ant almak için yaklaşık 5 dakika geçirdim.
Kevin Stembridge

3
ilk bağlantı artık öldü: /
Matt Clark

15

Maven hem bağımlılık yönetim aracı olarak çalışır - kavanozları merkezi bir depodan veya ayarladığınız bir havuzdan almak için kullanılabilir - hem de bildirim oluşturucu bir araç olarak kullanılabilir. "Bildirici" bir oluşturma aracı ile karınca veya marka gibi daha geleneksel bir araç arasındaki fark, nasıl yapıldığını değil, ne yapılması gerektiğini yapılandırmanızdır. Örneğin, bir maven komut dosyasında bir projenin bir WAR dosyası olarak paketlenmesi gerektiğini söyleyebilir ve maven bunun nasıl işleneceğini bilir.

Maven, “beyan edilebilirliğini” elde etmek için proje dizinlerinin nasıl düzenlendiğine dair sözleşmelere güveniyor. Örneğin, ana kodunuzu nereye koyacağınıza, web.xml'inizi nereye koyacağınıza, birim testlerinize vb. İlişkin bir kurala sahiptir, ancak gerektiğinde bunları değiştirme olanağı da sağlar.

Ayrıca, maven içinden karınca komutları çalıştırmak için bir eklenti olduğunu unutmayın:

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

Ayrıca, maven'in arketipleri bir projeye gerçekten hızlı bir şekilde başlamayı sağlar. Örneğin, çalışmaya hazır bir merhaba dünya tipi proje almak için çalıştırdığınız bir maven komutu sağlayan bir Wicket arketipi var.

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


11

Ant'i hiç görmemiş bir kişiyi alabilirim - onun eşyaları build.xmloldukça iyi yazılmış - ve neler olduğunu anlayabilirler. Aynı kişiyi alıp onlara Maven POM'u gösterebilirim ve neler olduğu hakkında hiçbir fikirleri olmayacak.

Büyük bir mühendislik organizasyonunda, insanlar Ant dosyalarının büyük ve yönetilemez hale gelmesi hakkında yazıyorlar. Bu türleri yazdım ve Ant komut dosyalarını temizledim. İleride ne yapmanız gerektiğini önceden anlamak ve 3 yıldan fazla bir süre boyunca değişime ve ölçeğe cevap verebilecek bir dizi şablon tasarlamak gerçekten.

Basit bir projeniz olmadıkça, Maven sözleşmelerini ve Maven'in işleri halletme yolunu öğrenmek biraz iştir.

Günün sonunda Ant veya Maven ile proje başlangıcını bir faktör olarak göremezsiniz: bu gerçekten toplam sahip olma maliyeti. Kuruluşun yapı sistemini birkaç yıl boyunca sürdürmesi ve genişletmesi için gereken şey, göz önünde bulundurulması gereken ana faktörlerden biridir.

Bir yapı sisteminin en önemli yönleri, bağımlılık yönetimi ve yapı reçetesini ifade etme esnekliğidir. İyi yapıldığında biraz sezgisel olmalıdır.


6

Projenizin büyüklüğüne bağlı olduğunu söyleyebilirim ... Kişisel olarak, Maven'i doğrudan derleme, paketleme ve dağıtım gerektiren basit projeler için kullanırım. Daha karmaşık şeyler yapmanız gerektiğinde (birçok bağımlılık, eşleme dosyaları oluşturma ...), Ant'e geçeceğim ...


Katılmıyorum. Basit projeler için maven kullanmanın iyi olduğunu kabul ediyorum, ancak karmaşıklığın artmasıyla, maven kullanımından elde ettiğiniz faydaların büyüklük sıralarıyla arttığını iddia ediyorum.
Benson

Ben de aynı fikirde değilim, Maven, birbiriyle ilişkili birçok modüle sahip daha karmaşık bir sisteminiz olduğunda gerçekten iyi çalışmaya başlar. İşlevsel testler yazmanız, raporlar çalıştırmanız ve veri havuzlarını bir depo yöneticisine dağıtmanız gerekiyorsa, neden bunları Ant ile birlikte yapasınız ki?
Tim O'Brien

Maven basit bir proje için iyi, ama daha karmaşık bir projede basit olması gereken şeyleri yapmaya çalışan bir kabus gördüm. Örneğin, dağıtılabilir bir paket oluşturmak, kodu şaşırtmak, webstart paketi oluşturmak, profilleri yapılandırmak. @Benson, projeniz daha karmaşık hale geldikçe Maven bir top ve zincir haline geliyor. Ant'in gücü ve esnekliği size Maven'den daha fazla verimlilik avantajı sağlayacaktır. @tobrien, Ant, çok modüllü projeler, işlevsel testler vb. için iyi çalışır. Maven'de varsayılan olmayan raporlama eklentilerini yapılandırmak genellikle Ant eşdeğerinden daha ayrıntılıdır.
Kevin Stembridge

Mevcut bir projeye maven eklemeye başladım ve işlerin beklendiği gibi çalışmadığını gördüm. Web sitesi php yerleşik ve bir komut dosyası kullanılarak dağıtılır. Maven'de bunlar düzgün çalışmıyor, çalışması için çok garip şeyler yapmanız gerekiyor.
Raul Luna

4

Maven ayrıca yaygın olarak kullanılan açık kaynaklı projelerin büyük bir deposuna ev sahipliği yapıyor. İnşa sırasında Maven, bir proje oluşturmanın bu bölümünü biraz daha yönetilebilir hale getirmek için sizin için bu bağımlılıkları (ve bağımlılık bağımlılıklarınız :) indirebilirsiniz.


2
+1, Merkezi Maven Deposu'nu çalışır durumda tutmak için gerekenleri gördükten sonra, içeri girip Maven ve Ivy gibi bir şey kullanan herkesin bir depo yöneticisi kurmayı düşünmesi gerektiğini önereceğim. Hangisi önemli değil, ama Nexus nexus.sonatype.org için kısmi biriyim .
Tim O'Brien
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.