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.
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.
Yanıtlar:
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
"," javac
Bu 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...
Nerede Maven ...
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
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:
Tersine:
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.
pom.xml
, çoğunu XSLT ile üretiyorum.
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.
Bazı farklılıkları listelemek için:
Güncelleme:
Bu Maven: Kesin Rehber'den geldi . Üzgünüm, alıntı yapmayı tamamen unuttum.
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 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.
Ant'i hiç görmemiş bir kişiyi alabilirim - onun eşyaları build.xml
oldukç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.
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 ...
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.