在任何穩固的軟件工程項目裡
構建工具都是開發人員工具包裡最重要的一個部件之一
沒有一個可靠的構建工具
編譯
包裝和發布過程都會從復雜性和時間需求等方面影響實際的編程過程
用於Java開發人員的構建工具選擇一直被局限於原有的基於UNIX的工具
例如Make
Make及其開放源代碼的派生工具能夠完成任務
但是正式嚴肅的工作常常還是要依賴於調用UNIX或者Windows命令來完成
這就意味著
Java代碼即使能夠做到跨平台和編寫一次就能各處使用
構建系統一般還是只能依賴於某種特定的平台
Java開發人員看到了這個問題
並意識到
通過提升Java平台的功能
他們能夠創建一個更加強大的構建工具
這個工具是專門為Java程序人員設計的
而且不會依賴於任何特定的平台
這就是Ant
一個由Apache基金會的Jakarta項目所管理的項目
Ant的配置文件是用XML文檔編寫的
所以Java程序員應該已經很熟悉其的語法了
這同Make聲名狼藉的不友好句法形成了鮮明的對比
更重要的是
構建系統用來構建項目的所有動作
也就是任務
也是用Java編寫的
所以同樣的構建文件能夠被運行在任何可以使用Java編譯器的地方
在Ant裡
所有的東西都是獨立自主的
在本文裡
我們將看到如何安裝Ant
如何創建用於構建項目的配置文件
以及如何使用可用的內置系統和條件任務
安裝Ant 要開始的話
我們就需要先去Ant主頁
它上面有最新的發行版本
在線使用手冊和FAQ
在下載和安裝Ant以前
你需要先安裝Java開發工具包(
或更高版本)
需要設置JAVA_HOME環境變量
在你的可執行路徑裡還需要javac編譯器
你可以從Jakata網站下載預編譯的ANT
你還要用到可選的Java Archive(JAR)文件
其包含的任務能有助於與其他開發工具進行集成
Ant也是開放源代碼軟件
所以如果你想修改任何內部組件來使其適應於自己的開發環境
這沒有問題
你要做的只是下載源代碼
但是要注意的是
Ant靈活性極強
這一點我們會在下一篇文章裡看到
向Ant添加功能是很容易的
而且不需要更改源代碼
一旦下載完了二進制包
你只需要簡單地把文件解壓到希望安裝Ant的地方
對於Windows系統
解壓到c:\ant\
在UNIX系統上
你可能希望安裝到/usr/local/ant/或者/opt/ant/下
下一步
你需要設置自己的環境變量
即ANT_HOME
在Windows上
假如我們安裝到c:\ant目錄下
圖A所示的命令會正確地設置你的環境變量
圖A 設置Windows的環境變量 在UNIX系統上
假設我們安裝在/usr/local/ant目錄下
圖B所示的命令會正確地設置你的環境變量
圖B 設置UNIX的環境變量 要在Windows或者UNIX系統上安裝可選的任務
你需要把可選的jar文件復制到$ANT_HOME/lib/目錄下
Ant或者ant
bat腳本會自動地把jar文件追加到類的路徑下
現在我們測試一下
確信Ant已經正確安裝好了
在命令行下
輸入ant
你應該會看到一條信息
見圖C
說Ant無法定位Build
xml文件
這正是我們所期望的
因為我們還要配置和創建項目文件
圖C 創建文件錯誤信息 既然Ant已經准備好了讀取項目文件
就讓我們看看項目文件是什麼樣的吧
創建項目
創建項目 為了讓開發人員的日子更加好過一點
Ant的配置文件是使用XML文檔編寫的
這樣開發人員不用去擔心空白的問題(Makefiles就有這個問題)
而且許多開發人員都已經能夠正確編寫XML了
Ant一啟動就會自動地加載一個叫做Build
xml的項目配置文件
如果想給這個項目配置文件取別的名字
你可以使用buildfile標記來運行ant
就像下面這樣
ant
buildfile Project_configuration
xml
在Listing A所示的SimpleBuild
xml配置文件裡
你會看到一個項目標簽
它帶有三個屬性
名字
缺省值和basedir
Ant使用說明裡有Ant配置文件裡每個標簽的詳細文檔
你可能要使用Ant使用說明作為參考書來了解哪些是必需的標簽
哪些有缺省值
在項目標簽裡
你會看到屬性和目標標簽
屬性標簽創建的變量能夠被任務和變量擴展訪問
正如我們在後面所要看到的一樣
有一些變量
像日期和時間
能夠在任務內部進行設置
所以不是所有的變量都會被明確地定義
在屬性標簽後面
你會看到目標標簽
你可以定義多個目標
每一個都有不同的名字
你會注意到目標標簽的名字是compile
這碰巧和項目標簽裡的缺省值相對應
這就意味著我們在執行Ant的時候
它會自動地啟動compile目標
目標裡有許多的任務
Ant按順序來執行它們
你會發現構建
包裝和發布過程中幾乎每一件事都可以由Ant的任務來處理
在進行簡單的構建時
我們使用tstamp任務來把當前的日期和時間設置到環境變量裡
下一步
我們會使用mkdir任務來創建一個叫做${build}的目錄
(假設它並不存在
這是我們腳本裡命令解釋程序擴展的第一個例子
Ant會自動把
${build}
擴展到屬性構建所設置的值裡
在這種情況下是build字符串
)
最後
我們會使用javac任務來編譯來自src目錄的源代碼
並把輸出保存到構建裡
在運行Ant時
我們會讓輸出來顯示每個目標執行的狀態
如圖D所示
圖D Ant的輸出 一個更加深入的例子
現在我們看看使用多個目標構建一個稍微復雜一點的配置的例子
在Listing B所示的Medium
xml例子裡
配置內容被分成的目標比SimpleBuild
xml例子裡的更多
把構建過程分成不同的目標意味著Ant可以從任何點進入構建過程
在SimpleBuild
xml裡
我們只用簡單地編譯Java源代碼
但是
在這個例子裡
我們啟動環境(init)
編譯代碼(compile)
把代碼包裝進jar(package)
再把結果復制進產品所在的位置(dist)
我們還有一個在任何代碼編譯以前通過還原來清除環境的任務
在缺省狀態下
我們會依次運行init
compile
package
然後是dist
你可以看到每個對象都有已定義的相依性
Ant在依賴相依性的目標完成以前就完成好相依性
缺省的目標是dist
所以在命令行運行ant會完成所有的任務
然而
我們可以通過在命令行指定用所希望的目標來執行所有步驟中的一部分
例如
我們可以只包裝代碼
而不發布它
把更大的項目分成多個目標能夠允許開發人員迅速地進行分段構建
而不必等待完整構建
這會有助於調試和保證高質量的過程
內置的任務 既然你已經看過了如何創建一個項目文件
那我們就看一些內置的任務
你會希望看一下Ant的文檔來獲得任務的細節
因為那裡所提供的信息比我們這裡所涉及的要多
文件系統任務 你可能會經常使用Ant來完成系統任務
移動
修改
復制和刪除文件
在發布和清除臨時文件時
你會需要移動文件
這就是為什麼懂得文件系統工具的使用是有必要的原因了
Listing C所示的Fs
xml 例子
給filesystem回應了一條信息
@…@
標志是Ant如何進行文本替換的標識
要替換文本就要在將被替換的文本前後加上
@
標志
在信息被復制到磁盤以後
我們創建兩個目錄
復制文件
在我們復制的時候對磁盤上的文件進行標志替換
再刪除一個已復制的文件
圖E是在Fs
xml構建文件上運行Ant的輸出結果
圖E Filesystem輸出實例 使用條件 在Ant裡構建條件不太容易
由於Ant構建任務和目標的方法
你不得不小心地構造你的陳述式
只有當屬性被設置成真值的時候
條件才能通過執行對象來工作
你可以使用and
or和not陳述式來構造你的條件
在一個條件被發現為真時
你可以使用antcall任務來執行另一個目標
讓我們來看一個簡單的例子
它會確定可選的聲音任務是否可用
以及它是否在UNIX或者Windows上可用
在Listing D所示的SoundConditional的例子裡
你會看到條件任務會調用兩個條件陳述式
condWinSound和condUnixSound
但是兩者都不會主動執行
除非條件屬性被設置
條件目標會檢查包裝是否可用(這是可選的jar文件一部分)
以及在哪個平台上可用
包裝 現在
你應該已經准備好開始把自己的軟件項目轉移到Ant構建工具上了
Ant正在越來越多地被開發人員用來支持大型的Java項目——而且是因為有了好的理由
這些工具是面向Java的
跨平台的
而且一般都比面向UNIX的工具要更容易使用
希望本文能夠讓你看到Ant的力量
也能有助於提高你所在組織的產出
在以後的文章裡
我們會來看通過創建自己的任務如何來擴展Ant
From:http://tw.wingwit.com/Article/program/Java/ky/201311/28307.html