maven和ant 比較

Ant 在構建過程方面十分優秀,它是一個基於任務和依賴的構建系統。每個任務包含一組由 XML 編碼的指令。有 copy 任務和 javac 任務,以及 jar 任務。在你使用 Ant的時候,你爲 Ant 提供特定的指令以編譯和打包你的輸出。看下面的例子,

一個簡單的 build.xml 文件

<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="org.apache.maven.model.Build@d7e661"/>
</target>
<target name="compile" depends="init"
description="compile the source " >
<!-- Compile the java code from ${src} into org.apache.maven.model.Build@d7e661 <javac srcdir="${src}" destdir="org.apache.maven.model.Build@d7e661"/>
</target>
<target name="dist" depends="compile"
description="generate the distribution" >
<!-- Create the distribution directory -->
<mkdir dir="${dist}/lib"/>
<!-- Put everything in org.apache.maven.model.Build@d7e661 into the MyProject-${<jar jarfile="${dist}/lib/MyProject-${DSTAMP}.jar" basedir="org.apache.maven.model.</target>
<target name="clean"
description="clean up" >
<!-- Delete the org.apache.maven.model.Build@d7e661 and ${dist} directory trees <delete dir="org.apache.maven.model.Build@d7e661"/>
<delete dir="${dist}"/>
</target>
</project>
在這個簡單的 Ant 例子中,你能看到,你需要明確的告訴 Ant 你想讓它做什麼。有一個包含 javac 任務的編譯目標用來將 src/main/java 的源碼編譯至 target/classes目錄。你必須明確告訴 Ant 你的源碼在哪裏,結果字節碼你想存儲在哪裏,如何將這些字節碼打包成 JAR 文件。雖然最近有些進展以幫助 Ant 減少程序,但一個開發者對Ant 的感受是用 XML 編寫程序語言。

用 Maven 樣例與之前的 Ant 樣例做個比較。在 Maven 中,要從 Java 源碼創建一個JAR 文件,你只需要創建一個簡單的 pom.xml,將你的源碼放在 /usr/local/hudson/hudson-home/jobs/maven-guide-zh-to-production/workspace/content-zh/src/main/java ,然後從命令行運行 mvn install。下面的樣例 Maven pom.xml 文件能完成和之前 Ant 樣例所做的同樣的事情。

一個簡單的 Maven pom.xml

<span style="font-family:Microsoft YaHei;"><project>
<modelVersion>4.0.0</modelVersion>
<groupId>org.sonatype.mavenbook</groupId>
<artifactId>my-project</artifactId>
<version>1.0</version>
</project></span>


這就是你 pom.xml 的全部。從命令行運行 mvn install 會處理資源文件,編譯源代碼,運行單元測試,創建一個 JAR ,然後把這個 JAR 安裝到本地倉庫以爲其它項目提供重用性。不用做任何修改,你可以運行 mvn site ,然後在 target/site 目錄找到一個 index.html 文件,這個文件鏈接了 JavaDoc 和一些關於源代碼的報告。誠然,這是一個最簡單的樣例項目。一個只包含源代碼並且生成一個 JAR 的項目。一個遵循 Maven 的約定,不需要任何依賴和定製的項目。如果我們想要定製行爲,我們的 pom.xml 的大小將會增加,在最大的項目中,你能看到一個非常複雜的 Maven POM的集合,它們包含了大量的插件定製和依賴聲明。但是,雖然你項目的 POM 文件變得增大,它們包含的信息與一個差不多大小的基於 Ant 項目的構建文件的信息是完全不同的。Maven POM 包含聲明:“這是一個 JAR 項目”,“源代碼在 src/main/java 目錄”。Ant 構建文件包含顯式的指令:“這是一個項目”,“源代碼在 src/main/java”,“針對這個目錄運行 javac ”,“把結果放到 target/classes ”,“從……創建一個 JAR ”,等等。Ant必須的過程必須是顯式的,而 Maven 有一些“內置”的東西使它知道源代碼在哪裏,如何處理它們。


該例中 Ant 和 Maven 的區別是:
Apache Ant

  • Ant 沒有正式的約定如一個一般項目的目錄結構,你必須明確的告訴 Ant 哪裏去找源代碼,哪裏放置輸出。隨着時間的推移,非正式的約定出現了,但是它們還沒有在產品中模式化。
  • Ant 是程序化的,你必須明確的告訴 Ant 做什麼,什麼時候做。你必須告訴它去編譯,然後複製,然後壓縮。
  • Ant 沒有生命週期,你必須定義目標和目標之間的依賴。你必須手工爲每個目標附上一個任務序列。
Apache Maven
  • Maven 擁有約定,因爲你遵循了約定,它已經知道你的源代碼在哪裏。它把字
節碼放到 target/classes ,然後在 target 生成一個 JAR 文件。
  • Maven 是聲明式的。你需要做的只是創建一個 pom.xml 文件然後將源代碼放
到默認的目錄。Maven 會幫你處理其它的事情。
  • Maven 有一個生命週期,當你運行 mvn install 的時候被調用。這條命令告訴 Maven 執行一系列的有序的步驟,直到到達你指定的生命週期。遍歷生命週期旅途中的一個影響就是,Maven 運行了許多默認的插件目標,這些目標完成了像編譯和創建一個 JAR 文件這樣的工作。

Maven 以插件的形式爲一些一般的項目任務提供了內置的智能。如果你想要編寫運行單元測試,你需要做的只是編寫測試然後放到 /usr/local/hudson/hudson-home/jobs/maven-guide-zh-to-production/workspace/content-zh/src/test/java ,添加一個對於 TestNG 或者 JUnit 的測試範圍依賴,然後運行 mvn test 。

如果你想要部署一個web 應用而非 JAR ,你需要做的是改變你的項目類型爲 war ,然後把你文檔根目錄置爲 /usr/local/hudson/hudson-home/jobs/maven-guide-zh-to-production/workspace/content-zh/src/main/webapp 。當然,你可以用 Ant 做這些事情,但是你將需要從零開始寫這些指令。使用 Ant ,你首先需要確定 JUnit JAR 文件應該放在哪裏,然後你需要創建一個包含這個 JUnit JAR 文件的 classpath ,然後告訴 Ant 它應該從哪裏去找測試源代碼,編寫一個目標來編譯測試源代碼爲字節碼,使用 JUnit 來執行單元測試。

沒有諸如 antlibs 和 lvy 等技術的支持(即使有了這些支持技術),Ant 給人感覺是自定義的程序化構建。項目中一組高效的堅持約定的 Maven POM ,相對於 Ant 的配置文件,只有很少的 XML 。Maven 的另一個優點是它依靠廣泛公用的 Maven 插件。所有人使用 Maven Surefire 插件來運行單元測試,如果有人添加了一些針對新的測試框架的支持,你可以僅僅通過在你項目的 POM 中升級某個特定插件的版本來獲得新的功能。

使用 Maven 還是 Ant 的決定不是非此即彼的,Ant 在複雜的構建中還有它的位置。如果你目前的構建包含一些高度自定義的過程,或者你已經寫了一些 Ant 腳本通過一
種明確的方法完成一個明確的過程,而這種過程不適合 Maven 標準,你仍然可以在Maven 中用這些腳本。作爲一個 Maven 的核心插件, Ant 還是可用的。自定義的插件可以用 Ant 來實現,Maven 項目可以配置成在生命週期中運行 Ant 的腳本。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章