【第169期 October 5, 2011】
 

研發新視界

淺談自動化構建工具Ant與實例分享

作者/楊凱鈞

[發表日期:2011/10/3]


Ant簡介

Ant是由Apache開發的一套基於JAVA的構建工具,全名為Another neat tool,取各首字母作為縮寫。

Ant是一款類似C、C++中經常使用到的make工具,只要有預先編輯好的buildfile即可確保每次構建檔時都能精確執行相同的構建步驟,避免隨著開發專案逐漸龐大步驟流程增加時的人為疏失發生。不同於make的是make必須藉由調用特定平台的shell命令來執行,Ant則因為使用跨平台的Java,只需要有相同的buildfile即可跨平台在任何有安裝Java的系統上做一致性的操作,這便是Ant的最大優勢。

Ant的結構

Ant的結構如下圖所示:


《圖一》

Ant沒有定義自己的語法,因為它的buildfile是用XML編寫,因此易於編輯與擴充、管理,每個buildfile包含以下四部份:

一、Project:

每個buildfile只能有一個project,其基本屬性為:
name: project名稱。
default: 預設執行的target。
basedir: 用於計算其他相對路徑的初始路徑,也就是指定執行的根目錄。

<例1>:

《圖二》

此例為名稱”BuildClasses”的project,預設執行的target為buildClasses,根目錄為上一層目錄。

二、Target:

一個project可以定義一個或多個target,每個target包含著一系列你想要執行的工作,像是編譯、打包、壓縮等等,其基本屬性為:
name: target的名稱
depends: target的相依關係,target的depends也決定了哪個target先執行
description: target的描述說明

<例2>:


《圖三》

此例為名稱”copyReleaseNote”的target,依靠”checkReleaseNote”執行完畢才開始此target的後續動作。

<例3>: 一個完整的簡易target

《圖四》

此target包含著刪除舊的jar、打包新的jar與sign jar檔的三個步驟。

三、Task:

Ant執行的工作由target構成,而target則是由數個task所組成,像是copy、delete、mkdir等都是屬於單一的task。
下面介紹一些常用的task:

  • copy


  • 《圖五》

    把${project.dir}\build底下所有包含Beans字眼的資料夾裡面META-INF\ejb-jar.xml與META-INF\jboss.xml複製到${ejb.config.dir},此例額外使用了兩個copy的參數:overwrite:是否覆蓋相同檔案、includeEmptyDirs:是否複製時包含空資料夾。此外相對於include,亦可使用exclude來決定不包含哪些檔案與資料夾。

    以下挑出幾個常用task舉例說明:

  • delete


  • 《圖六》刪除資料夾


    《圖七》刪除單一檔案


    《圖八》藉由include來指定該目錄下欲刪除的檔案;同樣也可以使用exclude來決定刪除時不包含哪些檔案。

  • javac


  • 《圖九》

    用來compile java source code,常用參數有:
    destdir:編譯完存放的位置
    source : 程式來源。
    target : 存放 class files位置。
    fork : 是否使用外部JDK compiler去執行javac;預設值是no.
    同樣也可以使用include & exclude來決定選擇的檔案。
    關於javac,更多參數請參考http://ant.apache.org/manual/Tasks/javac.html
  • java


  • 《圖十》


    行class檔,常用參數有:
    classname:需要執行的class名
    jar:需要執行的jar檔,必須包含程式的進入點也就是main方法的class
    args:執行class需要的啟動參數
    classpath:需要使用的classpath
  • jar


  • 《圖十一》

    將編譯好的class打包成JAR檔,常用參數有:
    compress:在打包的同時是否順便壓縮檔案,預設值為true
    duplicate:遇到已有相同檔案時的處理,共有add、preserve、fail三種參數可用
    destfile:打包完存放的位置
    關於jar,更多參數請參考http://ant.apache.org/manual/Tasks/jar.html
  • war


  • 《圖十二》


    《圖十三》

    將文件打包成war檔,可以使用include & exclude來決定選擇要包進的class、lib等等檔案。
    webxml: web.xml的路徑與檔名
    destfile: 要建立之war檔的名稱
  • ear


  • 《圖十四》

    將文件打包承ear檔,可以使用include & exclude來決定選擇要包進ear的檔案。
    appxml: META-INF/application.xml的路徑與檔名
    destfile: 要建立之ear檔的名稱

    四、Property:

    一個project可以有多個property,property算是一種特殊的task,主要是用於定義ant執行時的參數設定,可以使用於buildfile中或是直接通過ant命令輸入。

    <例四>:

    《圖十五》

    透過property即可預先設定好變數,之後只需使用${project.dir}之類的參數即可使用,除了name之外亦有file、url、resource等可以使用。較特別的是environmant,透過設定即可獲得系統的環境變數:

    <例五>:

    《圖十六》

    透過設定env為環境變數即可透過${env.PATH}去取得各種OS的變數。
    除了上述方式亦可以在執行ant時利用參數-D來定義property,如ant –Dproject.dir=D:\work\i4m。

    Ant執行

    Ant是一種命令形式的工具,可以透過各種不同的方式來執行,較常使用的是Unix、Linux Shell或是Windows的命令提示字元,只需輸入ant即可將同目錄下的build.xml作為buildfile執行。若是想自行指定buildfile而非使用預設的build.xml則使用ant –f 即可,如下圖


    《圖十七》

    Ant主要命令如下:
    ant [options] [target [target2 [target3] ...]]
    Options:


    總結

    Ant的目標在於盡可能的保持build版上的簡單與方便,它可以通過buildfile自動化執行大量的target與task,減少人為介入造成的疏失機會,同時有需修改時也只需要維護buildfile單一檔案即可,達到時間與人力成本的減量化。

    參考資料
    http://ant.apache.org/