一個(gè)簡(jiǎn)單的 build.xml 文件:
在這個(gè)簡(jiǎn)單的 Ant 例子中,你能看到,你需要明確的告訴 Ant 你想讓它做什么。有一個(gè)包含 javac 任務(wù)的編譯目標(biāo)用來將 src/main/java 的源碼編譯至 target/classes目錄。你必須明確告訴 Ant 你的源碼在哪里,結(jié)果字節(jié)碼你想存儲(chǔ)在哪里,如何將這些字節(jié)碼打包成 JAR 文件。雖然最近有些進(jìn)展以幫助 Ant 減少程序,但一個(gè)開發(fā)者對(duì)Ant 的感受是用XML 編寫程序語(yǔ)言。用 Maven 樣例與之前的 Ant 樣例做個(gè)比較。在 Maven 中,要從 Java 源碼創(chuàng)建一個(gè)JAR 文件,你只需要?jiǎng)?chuàng)建一個(gè)簡(jiǎn)單的 pom.xml,將你的源碼放在 /usr/local/hudson/hudson-home/jobs/maven-guide-zh-to-production/workspace/content-zh/src/main/java ,然后從命令行運(yùn)行 mvn install。下面的樣例 Maven pom.xml 文件能完成和之前 Ant 樣例所做的同樣的事情。
這就是你 pom.xml 的全部。從命令行運(yùn)行 mvn install 會(huì)處理資源文件,編譯源代碼,運(yùn)行單元測(cè)試,創(chuàng)建一個(gè) JAR ,然后把這個(gè) JAR 安裝到本地倉(cāng)庫(kù)以為其它項(xiàng)目提供重用性。不用做任何修改,你可以運(yùn)行 mvn site ,然后在 target/site 目錄找到一個(gè) index.html 文件,這個(gè)文件鏈接了 JavaDoc 和一些關(guān)于源代碼的報(bào)告。 Ant 和 Maven 的區(qū)別是: · Ant 是程序化的,你必須明確的告訴 Ant 做什么,什么時(shí)候做。你必須告訴它去編譯,然后復(fù)制,然后壓縮。 · Ant 沒有生命周期,你必須定義目標(biāo)和目標(biāo)之間的依賴。你必須手工為每個(gè)目標(biāo)附上一個(gè)任務(wù)序列。 Apache Maven · Maven 擁有約定,因?yàn)槟阕裱思s定,它已經(jīng)知道你的源代碼在哪里。它把字節(jié)碼放到 target/classes ,然后在 target 生成一個(gè) JAR 文件。 · Maven 是聲明式的。你需要做的只是創(chuàng)建一個(gè) pom.xml 文件然后將源代碼放到默認(rèn)的目錄。Maven 會(huì)幫你處理其它的事情。 · Maven 有一個(gè)生命周期,當(dāng)你運(yùn)行 mvn install 的時(shí)候被調(diào)用。這條命令告訴 Maven 執(zhí)行一系列的有序的步驟,直到到達(dá)你指定的生命周期。遍歷生命周期旅途中的一個(gè)影響就是,Maven 運(yùn)行了許多默認(rèn)的插件目標(biāo),這些目標(biāo)完成了像編譯和創(chuàng)建一個(gè) JAR 文件這樣的工作。Maven 以插件的形式為一些一般的項(xiàng)目任務(wù)提供了內(nèi)置的智能。如果你想要編寫運(yùn)行單元測(cè)試,你需要做的只是編寫測(cè)試然后放到 /usr/local/hudson/hudson-home/jobs/maven-guide-zh-to-production/workspace/content-zh/src/test/java ,添加一個(gè)對(duì)于 TestNG 或者 JUnit 的測(cè)試范圍依賴,然后運(yùn)行 mvn test 。如果你想要部署一個(gè)web 應(yīng)用而非 JAR ,你需要做的是改變你的項(xiàng)目類型為 war ,然后把你文檔根目錄置為 /usr/local/hudson/hudson-home/jobs/maven-guide-zh-to-production/workspace/content-zh/src/main/webapp 。當(dāng)然,你可以用 Ant 做這些事情,但是你將需要從零開始寫這些指令。使用 Ant ,你首先需要確定 JUnit JAR 文件應(yīng)該放在哪里,然后你需要?jiǎng)?chuàng)建一個(gè)包含這個(gè) JUnit JAR 文件的 classpath ,然后告訴 Ant 它應(yīng)該從哪里去找測(cè)試源代碼,編寫一個(gè)目標(biāo)來編譯測(cè)試源代碼為字節(jié)碼,使用 JUnit 來執(zhí)行單元測(cè)試。 沒有諸如 antlibs 和 lvy 等技術(shù)的支持(即使有了這些支持技術(shù)),Ant 給人感覺是自定義的程序化構(gòu)建。項(xiàng)目中一組高效的堅(jiān)持約定的 Maven POM ,相對(duì)于 Ant 的配置文件,只有很少的 XML 。Maven 的另一個(gè)優(yōu)點(diǎn)是它依靠廣泛公用的 Maven 插件。所有人使用 Maven Surefire 插件來運(yùn)行單元測(cè)試,如果有人添加了一些針對(duì)新的測(cè)試框架的支持,你可以僅僅通過在你項(xiàng)目的 POM 中升級(jí)某個(gè)特定插件的版本來獲得新的功能。 使用 Maven 還是 Ant 的決定不是非此即彼的,Ant 在復(fù)雜的構(gòu)建中還有它的位置。 如果你目前的構(gòu)建包含一些高度自定義的過程,或者你已經(jīng)寫了一些 Ant 腳本通過一種明確的方法完成一個(gè)明確的過程,而這種過程不適合 Maven 標(biāo)準(zhǔn),你仍然可以在 Maven 中用這些腳本。作為一個(gè) Maven 的核心插件, Ant 還是可用的。自定義的插件可以用 Ant 來實(shí)現(xiàn),Maven 項(xiàng)目可以配置成在生命周期中運(yùn)行 Ant 的腳本。 |
|