ant程式設計資料--非常簡單入門詳細

瓜瓜東西發表於2014-07-03
Ant 使用指南
Java愛好者第 1頁http://www.javafan.net
ANT使用指南
本教程來源互連網,僅供學習,
版權歸原作者及其出版商所有。
Ant 使用指南
Java愛好者第 2頁http://www.javafan.net
第一章 入門
本教程所講述的內容
在本教程中,您將學習 Ant 這個Java TM 專案生成工具。由於其靈活性和易用性,Ant 很快在 Java
開發人員中流行開來,因此您有必要了解關於它的更多資訊。
在繼續學習本教程之前,你不需要具備先前的Ant 經驗或知識。我們將首先檢視Ant 生成檔案
(build file)的基本結構,並學習如何呼叫這個工具。我們將逐步完成為一個簡單 Java 專案編
寫生成檔案的步驟,然後考察 Ant 的其他一些有用功能,包括檔案系統操作和模式匹配。最後編寫
一個擴充套件 Ant 功能的自己的Java 類來結束本教程。
在學習本教程的過程中,我們將同時展示如何從命令列以及從其他開放原始碼 Eclipse IDE 執行
Ant。試驗本教程中的例子不需要同時具備這兩種環境;您可以選擇其一,甚至選擇某種不同的開發
環境,只要該環境支援 Ant。如果選擇從命令列使用Ant,並且 Ant 還沒有安裝到機器上,您需要
遵循 Ant 主頁上的安裝說明。相反,如果決定僅使用 Eclipse 環境,您不需要單獨安裝Ant,因
為 Eclipse 已經包括了它。如果還沒有 Eclipse,您可以從 Eclipse.org下載Eclipse。
誰應該學習本教程?
如果您正在編寫 Java 程式碼卻還沒有使用 Ant,那麼本教程就是為您準備的。不管您當前是否在使
用某種不同的生成工具,或者根本就沒有使用生成工具,瞭解關於Ant 的更多知識或許會促使您轉
而使用它。
如果已經在使用 Ant,那麼您仍然可能在本教程中發現一些有趣的東西。或許您會發現一些預料之
外或無法完全理解的Ant 行為;本教程將會幫助您。或者,也許您熟悉Ant 的基礎,但是還想知
道諸如將生成檔案連結起來、使用 CVS 知識庫或編寫自定義任務等高階主題;本教程將會介紹所有
這些主題。
Ant 使用指南
Java愛好者第 3頁http://www.javafan.net
Ant 主要是設計用於生成 Java 專案的,但這並不是它唯一的用途。許多人發現它對其他任務也很
有幫助。比如以跨平臺的方式執行檔案系統操作。此外,還有許多可用的第三方 Ant 任務,而編寫
自定義的 Ant 任務也是相對簡單的,因此很容易針對特定的應用程式定製 Ant。
關於作者
Matt Chapman 1996 是英國 Hursley 的 IBM Centre for Java Technology 的諮詢軟體工程師。他
過去七年來一直致力於 Java 技術,包括 Java 虛擬機器實現和各類平臺、使用者介面工具包 Swing 和
AWT,以及近來為 Eclipse 平臺所編寫的工具。Matt 擁有電腦科學方面的學位,並且還是一名 Sun
認證的 Java 程式設計師。可通過mchapman@uk.ibm.com與他聯絡。
第二章 Ant基礎
簡介
本節將概述Ant 的功能和優勢,並討論它的歷史概況和日漸提高的普及性。然後我們通過考察一個
最基礎的生成檔案的基本結構,直接進入對 Ant 基礎的討論。我們還會介紹屬性和 依賴關係的
概念。
Ant 是什麼?
Apache Ant 是一個基於 Java 的生成工具。據最初的創始人 James Duncan Davidson 介紹,這個
工具的名稱是 another neat tool(另一個整潔的工具) 的首字母縮寫。
生成工具在軟體開發中用來將原始碼和其他輸入檔案轉換為可執行檔案的形式(也有可能轉換為可
安裝的產品映像形式)。隨著應用程式的生成過程變得更加複雜,確保在每次生成期間都使用精確
相同的生成步驟,同時實現儘可能多的自動化,以便及時產生一致的生成版本,這就變得更加重要
Ant 使用指南
Java愛好者第 4頁http://www.javafan.net
了。C 或 C++ 中的傳統專案經常使用 make 工具來做這件事情,其中生成任務是通過呼叫 shell 命
令來執行的,而依賴關係定義在每個生成檔案之間,以便它們總是以必需的順序執行。
Ant 與 make 類似,它也定義生成檔案之間的依賴關係;然而,與使用特定於平臺的 shell 命令來
實現生成過程所不同的是,它使用跨平臺的 Java 類。使用 Ant,您能夠編寫單個生成檔案,這個
生成檔案在任何 Java 平臺上都一致地操作(因為Ant 本身也是使用 Java 語言來實現的);這就
是 Ant 最大的優勢。
Ant 的其他關鍵優勢包括其突出的簡單性和無縫地使用自定義功能來擴充套件它的能力。但願您在完成
本教程其餘內容的學習之後,會欣賞 Ant 的這些優勢。
Ant 簡史
Ant 最初是Tomcat 的一個內部元件,Tomcat 是 Java Servlet 和JavaServer Pages (JSP) 參考
實現中使用的 servlet 容器。Tomcat 程式碼基被捐贈給了 Apache 軟體基金會;在那裡它又成了
Apache Jakarta 專案的組成部分,該專案致力於為Java 平臺產生開放原始碼的伺服器端解決方
案。Ant 的有用性很快得到了認可,對它的使用遍佈在其他 Jakarta 子專案中。因而,它自己也成
了一個 Jakarta 子專案,其第一個獨立版本於2000 年 7 月釋出。
從那以後,Ant 的普及性已經不斷地提高。它贏得了無數的行業大獎,併成為用於生成開放原始碼
Java 專案的事實上的標準。2002 年11 月,這些成功得到了確認,Ant 被提升為頂級 Apache 項
目。
在本文編寫之際,Ant 的當前穩定版本是 1.5.4,它支援 1.1 以後的所有 JDK 版本。下一個版本
(即 1.6 版)的 beta 版也已經可用,這些版本需要 JDK 1.2 或更高版本。未來的 2.0 版也正在
計劃之中,它將涉及一次重大的體系結構重新設計。Ant 2.0 將以改進的一致性和增強的功能為特
色,同時仍然保持 Ant 的簡單性、易於理解性和可擴充套件性等核心目標。
Ant 生成檔案剖析
Ant 使用指南
Java愛好者第 5頁http://www.javafan.net
Ant 沒有定義它自己的自定義語法;相反,它的生成檔案是用 XML 編寫的。存在一組 Ant 能夠理
解的預定義XML 元素,而且就像您將在下一節中看到的一樣,還可以定義新的元素來擴充套件Ant 的
功能。每個生成檔案由單個 project 元素組成,該元素又包含一個或多個target 元素。一個目標
(target)是生成過程中已定義的一個步驟,它執行任意數量的操作,比如編譯一組原始檔。這些
操作本身是由其他專用任務標籤執行的,我們將在後面看到這一點。然後這些任務將根據需要被分
組到各個 target 元素中。一次生成過程所必需的所有操作可以放入單個target 元素中,但是那
樣會降低靈活性。將那些操作劃分為邏輯生成步驟,每個步驟包含在它自己的 target 元素中,這
樣通常更為可取。這樣可以執行整體生成過程的單獨部分,卻不一定要執行其他部分。例如,通過
僅呼叫某些目標,您可以編譯專案的原始碼,卻不必建立可安裝的專案映像。
頂級 project 元素需要包含一個 default 屬性,如果在 Ant 被呼叫時沒有指定目標,這個屬性將
指定要執行的目標。然後需要使用 target 元素來定義該目標本身。下面是一個最基本的生成檔案:
<?xml version="1.0"?>
<project default="init">
<target name="init">
</target>
</project>
注意這是一個結構良好的 XML 文件,其中一個 XML 宣告指定了所使用的XML 的版本(這不是當前
的 Ant 所必需的,但是這樣做是一個好習慣),而且每個元素都正確地關閉了。一次性開啟和關
閉一個元素也是可以做到的。因此,與其像上面那樣對 target 元素使用單獨的起始和結束標籤,
我們可以將它寫為如下形式:
<target name="init"/>
當元素沒有包含任何內容時,更簡練的形式會更清晰。
新增描述:
我們在前一小節中看到的生成檔案是優雅簡練的,但它並沒有包含多少關於正在生成的實際專案的
資訊。可以通過許多方式來使它更具描述性,同時無需改變其功能。下面是一個例子:
Ant 使用指南
Java愛好者第 6頁http://www.javafan.net
<?xml version="1.0"?>
<project default="init" name="Project Argon">
<description>
A simple project introducing the use of descriptive tags in Ant build files.
</description>
<!-- XML comments can also be used -->
<target name="init" description="Initialize Argon database">
<!-- perform initialization steps here -->
</target>
</project>
可以看出,XML 註釋可以使用在整個生成檔案中以提高清晰性。而且,Ant 定義了它自己的
description 元素和description 屬性,它們可用於提供更結構化的註釋。
屬性
Ant 中的屬性類似程式語言中的變數,它們都具有名稱和值。然而與通常的變數不同,一經設定,
Ant 中的屬性就不可更改;它們是不可變的,就像 Java 語言中的 String 物件。這起初看來似乎
很有限制性,但這樣是為了遵循 Ant 的簡單原則: 畢竟,它是一個生成工具,而不是一種程式設計語
言。如果嘗試給某個現有屬性賦予一個新的值,這不會被看作是一個錯誤,但是該屬性仍然會保留
其現有值。(我們將會看到,這種行為是有用的。)
基於元素的描述性名稱和到目前為止所見到的屬性,在 Ant 中用於設定屬性的機制看起來如下就沒
有什麼奇怪了:
<property name="metal" value="beryllium"/>
為了在生成檔案的其他部分引用這個屬性,您會使用以下語法:
${metal}
例如,為了使用這樣一個值,它是另一個屬性的值的組成部分,您會將標籤寫為下面這樣:
<property name="metal-database" value="${metal}.db"/>
Ant 使用指南
Java愛好者第 7頁http://www.javafan.net
Ant 中有許多預定義的屬性。首先,Java 環境設定用於執行 Ant 的所有系統屬性,均可作為 Ant 屬
性使用,比如 ${user.home} 。除了這些屬性之外,Ant 還定義了它自己的一小組屬性,包括
${ant.version},這個屬性包含 Ant 的版本;以及${basedir},這個屬性是專案目錄的絕對路徑
(由包含生成檔案的目錄所定義,或者由 project 元素的可選basedir 屬性所定義)。
屬性經常用於引用檔案系統上的檔案或目錄,但是對於使用不同路徑分隔符(例如,/ 與 \)的平
臺來說,這樣可能在跨越不同平臺時導致問題。Ant 的 location 屬性專門設計用於以平臺無關的
方式包含檔案系統路徑。您會像下面這樣使用location 來代替value:
<property name="database-file" location="archive/databases/${metal}.db"/>
用於 location 屬性的路徑分隔字元將被轉換為當前平臺的正確格式;而且由於檔名是相對的,
它被認為是相對於專案的基目錄。我們同樣可以容易地寫為下面這樣:
<property name="database-file" location="archive\databases\${metal}.db"/>
這個標籤的兩個版本都會在不同的平臺具有相同的行為。如果可移植性是必需的,唯一要避免的內
容就是檔名中的 DOS 風格的驅動器號。在可能的地方使用相對路徑名稱而不是絕對路徑名稱,這
樣還會更加靈活。
定義依賴關係
生成一個專案一般需要許多步驟—— 例如首先要編譯原始碼,然後將它打包為 Java 歸檔檔案
(Java Archive File,JAR)。這其中許多步驟都具有清楚定義的順序—— 例如,在編譯器從源
程式碼生成類檔案之前,您不能打包類檔案。與順序指定 target 所不同的是,Ant 採用一種更靈活
的方法來定義依賴關係,就像 make 和類似的生成工具所做的那樣。每個目標的定義依據的是在
它在能夠執行之前必須完成的其他所有目標。這是使用 target 元素的 depends 屬性來實現的。例
如:
<target name="init"/>
<target name="preprocess" depends="init"/>
<target name="compile" depends="init,preprocess"/>
<target name="package" depends="compile"/>
Ant 使用指南
Java愛好者第 8頁http://www.javafan.net
這種方法允許您執行專案任何階段的生成過程;Ant 會首先執行已定義的先決階段。在上面的例子
中,如果讓 Ant 完成 compile 步驟,它將判斷出需要首先執行init 和preprocess 這兩個目標。
init 目標不依賴其他任何目標,因此它將首先被執行。然後 Ant 檢查 preprocesstarget,發現它
依賴 init 目標;由於已經執行了後者,Ant 不會再次執行它,因而開始執行 preprocess 目標。
最後可以執行 compile 任務本身。注意目標出現在生成檔案中的順序並不重要:執行順序是由
depends 屬性唯一確定的。
第三章 執行ANT
簡介
Apache Ant 可通過各種不同的方式來呼叫。就其本身而言,Ant 是一個命令列形式的工具,通常從
UNIX 或 Linux shell 提示符或者 Windows 命令提示符呼叫,生成檔案則使用您自己選擇的文字編
輯器來編寫。如果要生成的專案是以這種方式開發的,那麼這樣呼叫 Ant 很好,但是許多人發現 IDE
更方便。大多數IDE 都對Ant 提供了某種程度的支援,因此在使用IDE 的情況下,最起碼,您不
必麻煩地離開 IDE 來執行命令列操作就能呼叫Ant 生成任務。
在本節中,我們將考察如何從命令列使用Ant,並瞭解一些有用的命令列選項。然後簡要了解一下
開放原始碼的 Eclipse 平臺提供的 Ant 支援。(為了最充分地利用下面這些小節講述的內容,您
至少應該被動地熟悉Eclipse。)
從命令列執行Ant
從命令提示符呼叫 Ant 可以簡單得只需鍵入單獨的ant。如果您這樣做,Ant 將使用預設的生成文
件;該生成檔案中指定的預設目標就是 Ant 嘗試要生成的目標。還可以指定許多命令列選項,後面
跟著任意數量的生成目標,Ant 將按順序生成這其中的每個目標,並在此過程中解決所有依賴關係。
Ant 使用指南
Java愛好者第 9頁http://www.javafan.net
下面是從命令列執行的 Ant 生成任務的一些典型輸出:
Buildfile: build.xml
init:
[mkdir] Created dir: E:\tutorials\ant\example\build
[mkdir] Created dir: E:\tutorials\ant\example\dist
compile:
[javac] Compiling 8 source files to E:\tutorials\ant\example\build
dist:
[jar] Building jar: E:\tutorials\ant\example\dist\example.jar
BUILD SUCCESSFUL
Total time: 2 seconds
隨著我們繼續本教程的學習,我們將弄明白所有這些輸出意味著什麼。
命令列選項
就像 make 工具預設情況下尋找一個名為 makefile 的生成檔案一樣,Ant 尋找一個名為
build.xml 的檔案。因此,如果您的生成檔案使用這個名稱,就不需要在命令列指定它。當然,有
時使用具有其他名稱的生成檔案更方便,在那樣的情況下,您需要對 Ant 使用-buildfile <file>
引數(-f <file> 是其簡寫形式)。
另一個有用的選項是-D,它用於設定隨後可以在生成檔案中使用的屬性。這對於配置您想要以某種
方式開始的生成過程是非常有用的。例如,為了將name 屬性設定為某個特定的值,您會使用一個
類似下面這樣的選項:
-Dmetal=beryllium
這個功能可用於覆蓋生成檔案中的初始屬性設定。正如前面指出過的,屬性的值一經設定就不能改
變。-D 標誌在讀取生成檔案中的任何資訊之前設定某個屬性;由於生成檔案中的指派落在這個初始
指派之後,因此它不會改變其值。
Ant 使用指南
Java愛好者第 10頁http://www.javafan.net
IDE 整合
由於 Ant 的普及性,大多數現代 IDE 現在都整合了對它的支援,其他許多IDE 則在外掛提供對它
的支援。受支援的環境列表包括 JEdit 和Jext 編輯器、Borland JBuilder、IntelliJ IDEA、Java
Development Environment for Emacs (JDEE)、NetBeans IDE、Eclipse 以及 WebSphere® Studio
Application Developer。
請參閱參考資料以瞭解關於 Ant 的廣泛 IDE 支援的更多資訊。在本節的其餘部分,我們將探討開
放原始碼的Eclipse 環境所包括的 Ant 支援。
Eclipse 對Ant 的支援
開放原始碼的 Eclipse 專案提供了對Ant 的大量支援。這些支援的核心是Eclipse 的 Ant 編輯
器,它以語法高亮顯示為特色。該編輯器圖示如下:
這個編輯器提供內容輔助—— 例如,鍵入 <pro 然後按 Ctrl-Space,這樣將會顯示一個自動完成
列表,其中包含 <property> 標籤,以及對該任務的簡要說明。
您還可以看到一個大綱檢視,它顯示生成檔案的結構,並提供在該檔案中導航的便捷方式。此外還
有一個 Ant 檢視,它允許根據許多不同的 Ant 檔案生成目標。
Ant 使用指南
Java愛好者第 11頁http://www.javafan.net
從 Eclipse 內執行Ant 生成任務
名為 build.xml 的檔案在 Eclipse 的導航程式檢視中使用一個Ant 圖示來標識和裝飾。右鍵單擊
這些檔案會提供一個Run Ant... 選單選項,選擇這個選單選項將開啟一個類似如下的對話方塊:
來自該生成檔案的所有目標都顯示出來了,而預設的目標則處於選中狀態。在您決定是否要改變默
認目標之後,請按 Run 按鈕來執行 Ant。Eclipse 將切換到 Console 檢視,如下圖所示。錯誤將
以不同的顏色顯示出來,可以單擊輸出中的任務名稱來跳到生成檔案中的對應呼叫點。
Ant 使用指南
Java愛好者第 12頁http://www.javafan.net
Eclipse 中的檔案關聯
預設情況下,Eclipse 僅對名為 build.xml 的檔案使用 Ant 編輯器,不過可以容易地配置該編輯
器,使其識別具有其他名稱的檔案。從選單上選擇 Window=>Preferences,然後展開Workbench 組,
再選擇 File Associations 引數設定頁面。然後為預期的檔名新增一種新的檔案型別。例如,可
以為名為 mybuild.xml 的所有檔案新增一種新的檔案型別。如果想對具有 .xml 字尾的所有檔案
(特殊檔名除外,比如 plugin.xml,它在 Eclipse 中覆蓋萬用字元指定)做同樣的事情,您甚至
可以使用 *.xml。最後為這種新的檔案型別新增一個關聯的編輯器,然後從編輯器列表上選擇 Ant
editor,如下所示:
Ant 使用指南
Java愛好者第 13頁http://www.javafan.net
第四章 生成一個簡單的JAVA專案
簡介
現在我們已經清楚了Ant 生成檔案的格式,並瞭解瞭如何定義屬性和依賴關係以及如何執行 Ant,
下面可以開始為一個基本的 Java 專案構建一個生成環境了。這將包括學習用於編譯原始碼和組合
JAR 檔案的Ant 任務。
Ant 使用指南
Java愛好者第 14頁http://www.javafan.net
編譯原始碼
由於 Ant 的主要目標是生成Java 應用程式,它能夠內在地、出色地支援呼叫 javac 編譯器以及
其他 Java 相關任務就毫不奇怪了。下面是編譯 Java 程式碼的任務的編寫方式:
<javac srcdir="src"/>
這個標籤尋找 src 目錄中以.java 為副檔名的所有檔案,並對它們呼叫 javac 編譯器,從而在相
同的目錄中生成類檔案。當然,將類檔案放在一個單獨的目錄結構中通常會更清晰;可以通過新增
destdir 屬性來讓 Ant 做到這點。其他有用的屬性包括:
· classpath:等價於javac 的-classpath 選項。
· debug="true":指示編譯器應該帶除錯資訊編譯原始檔。
javac 任務的一個重要特點在於,它僅編譯那些它認為需要編譯的原始檔。如果某個類檔案已經存
在,並且對應的原始檔自從該類檔案生成以來還沒有改變過,那麼該原始檔就不會被重新編譯。javac
任務的輸出顯示了實際被編譯的原始檔的數目。編寫一個 clean 目標來從目標目錄移除生成的任何
類檔案是個很好的習慣。如果想要確保所有原始檔都已編譯,就可以使用這個任務。這種行為刻畫
了 Ant 的許多工的特點:如果某個任務能夠確定所請求的操作不需要執行,那麼該操作就會被跳
過。
像 Ant 一樣,javac 編譯器本身也是用Java 語言實現的。這對 Ant 中的javac 任務的使用來說
非常有利,因為它通常呼叫 Ant 執行所在的相同 Java 虛擬機器(JVM)中的編譯器類。在每次需要
編譯 Java 程式碼時,其他生成工具通常需要執行一個新的 javac 程式,從而需要一個新的JVM 實
例。但是在使用Ant 的情況下,只需要單個 JVM 例項,它既用於執行 Ant 本身,也用於執行所有
必需的編譯任務(以及其他相關任務,比如處理 JAR 檔案)。這是一種高效得多的資源使用方式,
能夠極大地縮短專案生成時間。
編譯器選項
正如我們從前一小節看到的,Ant 的 javac 任務的預設行為是呼叫執行 Ant 本身的任何 JVM 的標
準編譯器。然而,有時您可能想要單獨地呼叫編譯器—— 例如當你希望指定編譯器的某些記憶體選
Ant 使用指南
Java愛好者第 15頁http://www.javafan.net
項,或者需要使用一種不同級別的編譯器的時候。為實現這個目的,只需將 javac 的fork 屬性設
置為 true,比如像下面這樣:
<javac srcdir="src" fork="true"/>
如果想要指定一個不同的 javac 可執行檔案,並向它傳遞一個最大記憶體設定,您可以像下面這樣做:
<javac srcdir="src" fork="true" executable="d:\sdk141\bin\javac"
memoryMaximumSize="128m"/>
甚至可以將Ant 配置為使用某種不同的編譯器。受支援的編譯器包括開放原始碼的 Jikes 編譯器
和來自 GNU 編譯器集(GNU Compiler Collection,GCC)的 GCI 編譯器。(請參閱參考資料以了
解關於這兩種編譯器的更多資訊。)可以通過兩種方式指定這些編譯器:可以設定 build.compiler
屬性,這將應用於使用 javac 任務的所有場合;或根據需要設定每個javac 任務中的 compiler 屬
性。
javac 任務還支援其他許多選項。請參考 Ant 手冊以瞭解更多細節(請參閱參考資料)。
建立 JAR 檔案
在編譯 Java 原始檔之後,結果類檔案通常被打包到一個 JAR 檔案中,這個檔案類似 zip 歸檔文
件。每個 JAR 檔案都包含一個清單檔案,它可以指定該 JAR 檔案的屬性。
下面是 Ant 中 jar 任務的一個簡單使用例子:
<jar destfile="package.jar" basedir="classes"/>
這將建立一個名為 package.jar 的 JAR 檔案,並把 classes 目錄中的所有檔案新增到其中(JAR
檔案能夠包含任意型別的檔案,而不只是類檔案)。此處沒有指定清單檔案,因此 Ant 將提供一個
基本的清單檔案。
manifest 屬性允許指定一個用作該 JAR 檔案的清單的檔案。清單檔案的內容還可以使用 manifest
任務在生成檔案中指定。這個任務能夠像檔案系統寫入一個清單檔案,或者能夠實際巢狀在jar 之
內,以便一次性地建立清單檔案和 JAR 檔案。例如:
Ant 使用指南
Java愛好者第 16頁http://www.javafan.net
<jar destfile="package.jar" basedir="classes">
<manifest>
<attribute name="Built-By" value="${user.name}"/>
<attribute name="Main-class" value="package.Main"/>
</manifest>
</jar>
時間戳生成
在生成環境中使用當前時間和日期,以某種方式標記某個生成任務的輸出,以便記錄它是何時生成
的,這經常是可取的。這可能涉及編輯一個檔案,以便插入一個字串來指定日期和時間,或將這
個資訊合併到 JAR 或 zip 檔案的檔名中。
這種需要是通過簡單但是非常有用的 tstamp 任務來解決的。這個任務通常在某次生成過程開始時
呼叫,比如在一個 init 目標中。這個任務不需要屬性,許多情況下只需<tstamp/> 就足夠了。
tstamp 不產生任何輸出;相反,它根據當前系統時間和日期設定 Ant 屬性。下面是 tstamp 設定
的一些屬性、對每個屬性的說明,以及這些屬性可被設定到的值的例子:
屬性 說明 例子
DSTAMP 設定為當前日期,預設格式為yyyymmdd 20031217
TSTAMP 設定為當前時間,預設格式為hhmm 1603
TODAY 設定為當前日期,帶完整的月份2003 年 12 月 17 日
例如,在前一小節中,我們按如下方式建立了一個JAR 檔案:
<jar destfile="package.jar" basedir="classes"/>
在呼叫 tstamp 任務之後,我們能夠根據日期命名該 JAR 檔案,如下所示:
<jar destfile="package-${DSTAMP}.jar" basedir="classes"/>
因此,如果這個任務在 2003 年 12 月17 日呼叫,該 JAR 檔案將被命名為
package-20031217.jar。
Ant 使用指南
Java愛好者第 17頁http://www.javafan.net
還可以配置tstamp 任務來設定不同的屬性,應用一個當前時間之前或之後的時間偏移,或以不同
的方式格式化該字串。所有這些都是使用一個巢狀的 format 元素來完成的,如下所示:
<tstamp>
<format property="OFFSET_TIME"
pattern="HH:mm:ss"
offset="10" unit="minute"/>
</tstamp>
上面的清單將 OFFSET_TIME 屬性設定為距離當前時間 10 分鐘之後的小時數、分鐘數和秒數。
用於定義格式字串的字元與java.text.SimpleDateFormat 類所定義的那些格式字元相同。
綜合
前面幾小節為我們提供了生成簡單 Java 專案所需的足夠知識。下面將把這些程式碼片斷組合成一個
完整的生成檔案,它將編譯 src 目錄下的所有原始碼,將結果類檔案放在 build 目錄下,然後把
所有類檔案打包到 dist 目錄中的一個JAR 檔案中。要自己試驗這個生成檔案,您所需要的就是包
含一個或多個 Java 原始碼檔案的 src 目錄—— 這個目錄可以包含從簡單的“Hell World”程
序到來自某個現有專案的大量原始檔的任何內容。如果需要向 Java classpath 新增 JAR 檔案或其
他任何內容,以便成功地編譯原始碼,您只需在 javac 任務中為其新增一個 classpath 屬性。
該生成檔案看起來如下:
<?xml version="1.0"?>
<project default="dist" name="Project Argon">
<description>A simple Java project</description>
<property name="srcDir" location="src"/>
<property name="buildDir" location="build"/>
<property name="distDir" location="dist"/>
<target name="init">
<tstamp/>
<mkdir dir="${buildDir}"/>
<mkdir dir="${distDir}"/>
</target>
Ant 使用指南
Java愛好者第 18頁http://www.javafan.net
<target name="compile" depends="init">
<javac srcdir="${srcDir}" destdir="${buildDir}"/>
</target>
<target name="dist" depends="compile">
<jar destfile="${distDir}/package-${DSTAMP}.jar" basedir="${buildDir}">
<manifest>
<attribute name="Built-By" value="${user.name}"/>
<attribute name="Main-Class" value="package.Main"/>
</manifest>
</jar>
<jar destfile="${distDir}/package-src-${DSTAMP}.jar" basedir="${srcDir}"/>
</target>
<target name="clean">
<delete dir="${buildDir}"/>
<delete dir="${distDir}"/>
</target>
</project>
下面是使用該檔案執行的某次生成過程的示例輸出(您得到的輸出可能不一樣,具體取決於src 目
錄的內容):
Buildfile: build.xml
init:
[mkdir] Created dir: E:\tutorial\javaexample\build
[mkdir] Created dir: E:\tutorial\javaexample\dist
compile:
[javac] Compiling 10 source files to E:\tutorial\javaexample\build
dist:
[jar] Building jar: E:\tutorial\javaexample\dist\package-20031217.jar
[jar] Building jar: E:\tutorial\javaexample\dist\package-src-20031217.jar
BUILD SUCCESSFUL
Total time: 5 seconds
Ant 使用指南
Java愛好者第 19頁http://www.javafan.net
注意 JAR 檔案是根據當前日期來命名的,並且為應用程式的主類設定了一個清單條目,以便主類能
夠通過一個簡單的命令 java -jar package-20031217.jar 來直接執行。我們還建立了一個JAR 文
件,它僅包含專案的原始碼。
第五章 檔案系統操作
簡介
我們瞭解了關於 Ant 的足夠多的知識,現在能夠生成一個基本的Java 專案了,不過現實中的專案
當然很少像我們的例子那樣簡單。在下面幾節中,我們將考察 Ant 的許多附加功能中的一部分,以
及能夠使用它們的場合。
在本節中,我們將考察如何執行常見檔案操作,比如建立目錄和解壓縮檔案。 Ant 的優秀特性之一
在於,執行這些操作的任務一般在所有平臺上都是相同的。
建立和刪除目錄
最基本的檔案系統操作之一就是建立目錄或資料夾。做這項工作的任務名為 mkdir,毫不奇怪,它
非常類似於具有相同名稱的 Windows 和 UNIX/Linux 命令。
<mkdir dir="archive/metals/zinc"/>
首先要注意/ 被用作目錄分隔符,這是UNIX 和Linux 的慣例。您可能認為這不是很平臺無關的,
但是 Ant 知道如何處理它,並針對它執行所在的平臺做恰當的事情,這與我們在前面定義基於位置
的屬性時所看到的方式相同。我們能夠同樣容易地使用 \,而不管平臺是什麼—— Ant 能夠處理
任一種形式,甚至能夠處理兩種形式的混合。
mkdir 任務的另一個有用特性是它的如下能力:在父目錄還不存在時建立它們。考慮一下上面的清
單,設想 archive 目錄存在,但是 metals 目錄不存在。如果使用底層平臺的 mkdir 命令,您需
要首先顯式地建立 metals 目錄,然後第二次呼叫mkdir 命令來建立 zinc 目錄。但是 Ant 任務
Ant 使用指南
Java愛好者第 20頁http://www.javafan.net
比這更加智慧,它能夠一次性建立這兩個目錄。類似地,如果目標目錄已經存在,mkdir 任務不會
發出錯誤訊息,而只是假設它的工作已經完成,從而什麼也不做。
刪除目錄同樣也很容易:
<delete dir="archive/metals/zinc"/>
這將刪除指定的目錄連同它包含的所有檔案以及子目錄。使用 file 屬性而不是 dir 屬性可以指定
要刪除的單個檔案。
複製和移動檔案及目錄
在 Ant 中製作檔案的一份拷貝很簡單。例如:
<copy file="src/Test.java" tofile="src/TestCopy.java"/>
您還可以使用 move 來執行重新命名操作而不是拷貝檔案:
<move file="src/Test.java" tofile="src/TestCopy.java"/>
另一個常用的檔案系統操作是將檔案複製或移動到另一個目錄。做這項工作的Ant 語法同樣也很簡
單:
<copy file="src/Test.java" todir="archive"/>
<move file="src/Test.java" todir="archive"/>
預設情況下,Ant 僅輸出它執行的移動和複製操作的摘要,包括諸如已移動或複製的檔案的數量等
資訊。如果想看到更詳細的資訊,包括涉及的檔名稱等,您可以將 verbose 屬性設定為true。
建立和解壓縮zip 及tar 檔案
在前一節中,我們看到了如何建立JAR 檔案。建立其他歸檔檔案的過程幾乎完全相同。下面是建立
zip 檔案的Ant 任務:
<zip destfile="output.zip" basedir="output"/>
Ant 使用指南
Java愛好者第 21頁http://www.javafan.net
相同的語法也可用於建立 tar 檔案。還可以使用GZip 和 BZip 任務來壓縮檔案。例如:
<gzip src="output.tar" zipfile="output.tar.gz"/>
解壓縮和提取檔案同樣也很簡單:
<unzip src="output.tar.gz" dest="extractDir"/>
還可以包括overwrite 屬性來控制覆蓋行為。預設設定是覆蓋與正在被提取的歸檔檔案中的條目相
匹配的所有現有檔案。相關的任務名稱是 untar、unjar、gunzip 和 bunzip2。
替換檔案中的標記
我們將在本節考察的最後一個檔案系統操作是replace 任務,它執行檔案中的查詢和替換操作。
token 屬性指定要查詢的字串,value 屬性指定一個新的字串,查詢到的標記字串的所有實
例都被替換為這個新的字串。例如:
<replace file="input.txt" token="old" value="new"/>
替換操作將在檔案本身之內的適當位置進行。為了提供更詳細的輸出,可把 summary 屬性設定為
true。這將導致該任務輸出找到和替換的標記字串例項的數目。
第六章 其它有用的任務和技術
簡介
在考察自定義的任務之前,我們首先介紹一些還沒遇到過的有用功能。Ant 標準地附帶了大量的功
能,因此這裡僅經挑選其中幾個最有用的功能。模式匹配和檔案選擇器是功能強大的機制,它們極
大地增強了我們已看到過的一些任務的功能;將生成任務連結起來以及與CVS 知識庫協同工作,是
已發現的這些機制的兩個主要實際應用領域。
模式匹配
Ant 使用指南
Java愛好者第 22頁http://www.javafan.net
在前面考察檔案系統任務時,我們僅使用了單獨地命名的檔案和目錄。然而,一次對一組檔案執行
那些操作經常是有用的—— 例如對給定目錄中以.java 結尾的所有檔案執行操作。正如等價的
DOS 和 UNIX 命令提供了這樣的功能一樣,Ant 也提供了這樣的功能。這是使用萬用字元字元來完成
的:*,它匹配零個或多個字元;以及 ?,它僅匹配一個字元。因而匹配以 .java 結尾的所有檔案
的模式不過就是 *.java。
也可以對目錄執行模式匹配。例如,模式 src*/*.java 將匹配帶 src 字首的任何目錄中的所有
Java 檔案。還有另一種模式結構:**,它匹配任意數量的目錄。例如,模式**/*.java 將匹配當
前目錄結構下的所有Java 檔案。
您能夠以相當一致的方式對檔案系統任務使用模式,比如巢狀的fileset 元素。先前,我們使用這
個任務來複制單個檔案:
<copy file="src/Test.java" todir="archive"/>
如果我們想要使用一個模式,可以將 file 屬性替換為一個 fileset 元素,如下所示:
<copy todir="archive">
<fileset dir="src">
<include name="*.java"/>
</fileset>
</copy>
fileset 預設情況下包含指定src 目錄下的所有檔案,因此為了僅選擇 Java 檔案,我們對模式使
用一個 include 元素。類似地,我們可以對另一個模式新增一個 exclude 元素,從而潛在地排除
include 指定的匹配項。甚至可以指定多個include 和 exclude 元素;這樣將得到一組檔案和目錄,
它們包含 include 模式的所有匹配項的並集,但排除了 exclude 模式的所有匹配項。
注意還有一個通常很有用的檔案集特性,但是對於沒有意識到它的人來說,這個特性偶爾會產生混
淆。這個特性稱為預設排除:即自動從檔案集內容中排除的內建模式列表。該列表包括與名為CVS
的目錄相匹配的條目,以及以 ~ 字元結尾的檔案,它們可能是備份檔案。您通常不想在檔案系統操
作中包括這類檔案和目錄,因此排除這些檔案是預設行為。然而,如果確實想無例外地選擇所有文
件和目錄,可以將檔案集的 defaultexcludes 屬性設定為 no。
Ant 使用指南
Java愛好者第 23頁http://www.javafan.net
使用選擇器
正如我們已經看到的,檔案集用於指定一組檔案,並且這個組的內容可以使用 include 和exclude
模式來指定。也可以結合稱為選擇器 的特殊元素使用include 和 exclude 來選擇檔案。下面是
對 Ant 可用的核心選擇器的列表:
· size:這個選擇器用於根據檔案的位元組大小選擇檔案(除非使用units 屬性來指定了不同
的單位)。when 屬性用於設定比較的性質(less、more 或者 equal),value 屬性定義每
個檔案將與之作比較的目標大小。
· contains:只有包含給定文字字串(由text 屬性指定)的檔案才匹配這個選擇器。預設
情況下,查詢操作是大小寫敏感的;新增casesensitive="no" 可以改變預設設定。
· filename:name 屬性指定檔名要與之匹配的模式。它本質上與include 元素相同,以及
與指定了negate="yes" 時的exclude 元素相同。
· present:從當前目錄結構中選擇如下檔案:它們與指定的 targetdir 目錄中的檔案具有相
同的名稱和相對目錄結構。
· depend:這個選擇器與 present 選擇器具有相同的效果,只不過匹配的檔案被限制到相對
於 targetdir 位置中的對應檔案來說,最近已修改過的那些檔案。
· date:這個選擇器基於其最後修改日期選擇檔案。when 屬性指定作比較的性質是before、
after 還是equal,datetime 屬性指定與之作比較的日期和時間,這個日期和時間具有給
定的固定格式 MM/DD/YYYY HH:MM AM_or_PM。注意 Windows 平臺上有一個內建的 2 秒偏移,
以允許底層檔案系統的不精確性—— 這可能導致匹配的檔案數量超過預期。允許的迴旋時
間量可以使用 granularity 屬性來更改(以毫秒為單位來指定)。
· depth:這個選擇器檢查每個檔案的目錄結構層次數目。min 和/或 max 屬性用於選擇具有
想要的目錄層次數目的的檔案。
Ant 使用指南
Java愛好者第 24頁http://www.javafan.net
還可以通過在一個選擇器容器 內巢狀一個或多個選擇器來組合選擇器。最常用的選擇器容器and
僅選擇它包含的所有選擇器都選擇了的檔案。其他選擇其容器包括 or、not、none 和 majority。
下面是一個檔案集的例子,它僅選擇那些大於512 位元組並且包含字串“hello”的檔案。
<fileset dir="dir">
<and>
<contains text="hello"/>
<size value="512" when="more"/>
</and>
</fileset>
將生成檔案連結起來
有兩種生成大型專案的不同方法。一種是讓一個單一的生成檔案做所有事情;另一種是讓高階別的
生成檔案呼叫其它生成檔案以執行特定任務,從而將生成過程劃分為許多較小的部分。
使用 ant 任務來從一個 Ant 生成中呼叫另一個 Ant 生成是很容易的。在簡單的情況下,您可以使
用 antfile 屬性,僅指定那些要使用的生成檔案,Ant 將生成該生成檔案中的預設目標。例如:
<ant antfile="sub-build.xml"/>
在父生成檔案中定義的任何屬性預設將傳遞給子生成檔案,雖然這可以通過指定
inheritAll="false"來避免。通過使用property 元素來傳入顯式的屬性也是可以做到的—— 即
使將 inheritAll 設定為 false,這些屬性也仍然適用於子生成檔案。這個功能很適合用於給子生
成檔案傳入引數。
讓我們來考慮一個例子。下面是我們想要呼叫的一個生成檔案:
<?xml version="1.0"?>
<project default="showMessage">
<target name="showMessage">
<echo message="Message=${message}"/>
</target>
</project>
Ant 使用指南
Java愛好者第 25頁http://www.javafan.net
(我們在前面還沒有遇到過 echo 任務—— 它簡單地輸出給定的訊息。)
下面是呼叫第一個生成檔案的第二生成檔案,它還給第一個生成檔案傳入message 屬性:
<?xml version="1.0"?>
<project default="callSub">
<target name="callSub">
<ant antfile="sub.xml" target="showMessage" inheritAll="false">
<property name="message" value="Hello from parent build"/>
</ant>
</target>
</project>
執行第二個生成檔案所得到的輸出如下:
Buildfile: build.xml
callSub:
showMessage:
[echo] Message=Hello from parent build
BUILD SUCCESSFUL
Total time: 0 seconds
使用 CVS 知識庫
CVS 是 concurrent versions system(併發版本控制系統) 的縮寫。它是一個原始碼控制系統,
設計用於跟蹤許多不同開發人員做出的更改。它非常流行,在開放原始碼專案中特別受歡迎。Ant 提
供了與 CVS 的緊密整合。這對於自動化生成環境是非常有用的,因為單個生成檔案也可以從原始碼
知識庫中提取出一個或多個模組,生成專案,甚至基於自從前次執行生成以來所作的變更生成批處
理檔案。
注意,為了利用Ant 中的cvs 任務,您需要在機器上安裝 cvs 命令,並使其從命令列可用。這個
命令包括在大多數 Linux 發行套件中;它也以多種形式對 Windows 可用—— 例如作為寶貴的
Cygwin 環境的一部分。(請參閱參考資料以瞭解關於 Cygwin 的更多資訊。)
Ant 使用指南
Java愛好者第 26頁http://www.javafan.net
下面是從 CVS 知識庫提取模組的一個例子生成檔案:
<?xml version="1.0"?>
<project name="CVS Extract" default="extract" basedir=".">
<property name="cvsRoot" value=":pserver:anonymous@dev.eclipse.org:/home/eclipse"/>
<target name="extract">
<cvs cvsRoot="${cvsRoot}"
package="org.eclipse.swt.examples"
dest="${basedir}"/>
</target>
</project>
cvs 任務的主要屬性是 cvsRoot,它是對 CVS 知識庫的完整引用,包括連線方法和使用者詳細資訊。
這個引數的格式如下:
[:method:][[user][:password]@]hostname[:[port]]/path/to/repository
在上面的例子中,我們作為匿名使用者連線到 Eclipse 專案的中央知識庫。然後其他屬性指定了我們
希望提取的模組以及放置提取檔案的目的地。提取是 CVS 任務的預設操作;其他操作可通過使用
command 屬性來指定。
請參閱參考資料以瞭解關於 CVS 的更多資訊。
第七章 使用自定義任務來擴充套件ANT
簡介
正如我們從前述幾節中所看到的,Ant 非常強大,具有涵蓋廣泛功能集的許多核心任務。它還有許
多這裡沒有介紹的附加任務,再加上提供廣泛附加功能的許多可選任務,以及作為 Ant-Contrib 項
目的一部分來提供的其他任務;最後,Apache Ant 主頁上還列出了外部可用的更多工。面對 Ant
提供的所有這些任務,您似乎再也不需要其他任務了,但是 Ant 的真正力量在於它的易於擴充套件性。
事實上,恰恰正是這種可擴充套件性促使人們開發瞭如此多的附加任務。
Ant 使用指南
Java愛好者第 27頁http://www.javafan.net
可能會存在這樣的場合,在那樣的場合下建立自定義的任務更為合適。例如,假設您建立了一個命
令行工具來執行某個特定操作;這個工具可能是將對Ant 可用的任務的恰當候選者(當該工具是用
Java 語言編寫的時更是這樣,雖然該工具不一定是用 Java 語言編寫的。)與其讓Ant 使用 exec
任務外部地呼叫該工具(這樣將引入依賴關係,並使得生成檔案在跨越不同平臺時更難於使用),
您可以將它直接合併到生成檔案中。還可以使得 Ant 的常規檔案集和萬用字元匹配功能對自定義的任
務可用。
在本節中,我們將考察一個簡單自定義任務的構造過程。這個任務將對檔案中的行執行排序操作,
並將排序後的行集寫到一個新檔案中。
建立自定義的任務
為實現一個簡單的自定義任務,我們所需做的就是擴充套件 org.apache.tools.ant.Task 類,並重寫
execute() 方法。因此,作為這個檔案排序自定義任務的框架,我們將編寫如下程式碼:
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.Task;
public class FileSorter extends Task {
// The method executing the task
public void execute() throws BuildException {}
}
注意我們宣告 execute() 方法丟擲一個 BuildException 異常。如果這個任務出了任何錯誤,我們
將丟擲這個異常以便向 Ant 指出故障。
大多數任務,不管是核心任務還是自定義任務,都利用屬性來控制它們的行為。對於這個簡單任務,
我們需要一個屬性來指定要排序的檔案,需要另一個屬性來指定排序內容的輸出。我們把這兩個屬
性分別叫做file 和tofile。
Ant 使得支援自定義任務中的屬性非常容易。為此,我們只需實現一個具有特別格式化的名稱的方
法,Ant 能夠使用生成檔案中指定的對應屬性的值來呼叫這個方法。這個方法的名稱需要是set 加
Ant 使用指南
Java愛好者第 28頁http://www.javafan.net
上屬性的名稱,因此在這個例子中,我們需要名為 setFile() 和setTofile() 的方法。當 Ant 遇
到生成檔案中的一個屬性設定時,它會尋找相關任務中具有適當名稱的方法(稱為 setter 方法)。
生成檔案中的屬性是作為字串來指定的,因此我們的 setter 方法的引數可以是一個字串。在
這樣的情況下,Ant 將在展開值所引用的任何屬性之後,使用該屬性的字串值來呼叫我們的方法。
但有時我們想把屬性的值看作是一種不同的型別。這裡的示例任務就是這種情況,其中的屬性值引
用檔案系統上的檔案,而不只是引用任意的字串。可以通過將方法引數宣告為 java.io.File 類
型來容易地做到這點。Ant 將接受屬性的字串值,並把它解釋為一個檔案,然後傳遞給我們的方
法。如果檔案是使用相對路徑名稱來指定的,則會被轉換為相對於專案基目錄的絕對路徑。Ant 能
夠對其他型別執行類似的轉換,比如 boolean 和 int 型別。如果您提供具有相同名稱但是具有不
同引數的兩個方法,Ant 將使用更明確的那一個方法,因此檔案型別將優先於字串型別。
這個自定義任務需要的兩個 setter 方法類似如下:
// The setter for the "file" attribute
public void setFile(File file) {}
// The setter for the "tofile" attribute
public void setTofile(File tofile) {}
實現自定義的任務
使用前一小節開發的框架,現在我們能夠完成這個簡單的檔案排序任務的實現:
import java.io.*;
import java.util.*;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.Task;
/**
* A simple example task to sort a file
*/
public class FileSorter extends Task {
private File file, tofile;
// The method executing the task
Ant 使用指南
Java愛好者第 29頁http://www.javafan.net
public void execute() throws BuildException {
System.out.println("Sorting file="+file);
try {
BufferedReader from =
new BufferedReader(new FileReader(file));
BufferedWriter to =
new BufferedWriter(new FileWriter(tofile));
List allLines = new ArrayList();
// read in the input file
String line = from.readLine();
while (line != null) {
allLines.add(line);
line = from.readLine();
}
from.close();
// sort the list
Collections.sort(allLines);
// write out the sorted list
for (ListIterator i=allLines.listIterator(); i.hasNext(); ) {
String s = (String)i.next();
to.write(s); to.newLine();
}
to.close();
} catch (FileNotFoundException e) {
throw new BuildException(e);
} catch (IOException e) {
throw new BuildException(e);
}
}
// The setter for the "file" attribute
public void setFile(File file) {
this.file = file;
}
// The setter for the "tofile" attribute
public void setTofile(File tofile) {
this.tofile = tofile;
}
}
兩個 setter 方法簡單地對屬性的值排序,以便這些值能夠在 execute() 方法中使用。這裡,輸入
檔案被逐行地讀入一個列表中,然後被排序並逐行地輸出到輸出檔案。注意,為簡單起見,我們很
Ant 使用指南
Java愛好者第 30頁http://www.javafan.net
少執行錯誤檢查—— 例如,我們甚至沒有檢查生成檔案是否設定了必需的屬性。不過我們的確至
少捕捉了所執行的操作丟擲的I/O 異常,並將這些異常作為 BuildExceptions 重新丟擲。
現在可以使用 javac 編譯器或從某個IDE 內編譯這個自定義的任務。為了解決所使用的 Ant 類的
引用問題,您需要把 ant.jar 檔案的位置新增到classpath 中。這個檔案應該在 Ant 安裝路徑下
的 lib 目錄。
使用自定義的任務
現在我們已經開發和編譯了這個自定義的任務,下面可以從生成檔案中利用它了。
在能夠呼叫自定義的任務之前,我們需要給它指定一個名稱來定義它,並告訴 Ant 關於實現這個
任務的類檔案的資訊,以及定位該類檔案所必需的任何 classpath 設定。這是使用 taskdef 任務
來完成的,如下所示:
<taskdef name="filesorter"
classname="FileSorter"
classpath="."/>
大功告成!現在可以像使用 Ant 的核心任務一樣使用這個自定義的任務了。下面是一個完整的生成
檔案,它顯示了這個自定義任務的定義和用法:
<?xml version="1.0"?>
<project name="CustomTaskExample" default="main" basedir=".">
<taskdef name="filesorter"
classname="FileSorter
classpath="."/>
<target name="main">
<filesorter file="input.txt" tofile="output.txt"/>
</target>
</project>
現在在當前工作目錄中建立一個 input.txt 檔案來測試這個自定義的任務。例如:
Hello there
This is a line
Ant 使用指南
Java愛好者第 31頁http://www.javafan.net
And here is another one
下面是執行上面的生成檔案之後產生的控制檯輸出:
Buildfile: build.xml
main:
[filesorter] Sorting file=E:\tutorial\custom\input.txt
BUILD SUCCESSFUL
Total time: 0 seconds
注意 input.txt 的相對路徑名稱被轉換成了當前目錄中的一個絕對路徑名稱。這是因為我們將
setter 方法的引數指定為 java.io.File 型別而不是 java.lang.String 型別。
現在看一下這個任務實際是否能工作。這時應該已經在同一目錄中建立了名為 output.txt 的檔案,
它包含以下內容:
And here is another one
Hello there
This is a line
您可以嘗試指定一個不存在的輸入檔案,以確定該任務是如何向Ant 報告“file not found”異
常的。
祝賀您:您現在已經開發和使用了一個自定義的Ant 任務!建立更復雜的任務還會涉及其他許多方
面,參考資料包含了指向此主題的進一步資訊源的連結。
Ant 使用指南
Java愛好者第 32頁http://www.javafan.net
第八章結束語和參考資料
結束語
我們希望您會發現這次 Ant 之旅很有幫助。同時,Ant 的目標是保持儘可能簡單,它通過大量的任
務提供了大量的功能,每個任務都有許多選項,有時這可能是令人難以招架的。我們無法在單個教
程中探索 Ant 的所有功能,但願我們已經介紹了所有的基本概念和足夠的基本功能,以使您步入開
始在現實現目中使用Ant 的軌道。下面總結一下本教程介紹過的內容:
· Ant 生成檔案是如何構造的
· 如何從命令列以及從Eclipse 內執行Ant
· 如果通過編譯原始碼、建立 JAR 檔案以及時間戳檔案(以識別每次生成過程的輸出)來生
成簡單的 Java 專案
· 如何在 Ant 中執行基本的檔案系統操作
· 模式匹配和選擇器的基本概念,再加上如何從一個生成檔案呼叫另一個生成檔案,以及如何
執行 CVS 操作
· 如何通過編寫 Java 類來擴充套件Ant 的標準功能
要繼續 Ant 之旅,請訪問下一小節中的某些連結,同時熟悉 Ant 手冊中的內容,該手冊是編寫 Ant
生成檔案時的權威參考源。祝您好運!
Ant 使用指南
Java愛好者第 33頁http://www.javafan.net
參考資料
· 訪問Apache Ant 主頁。這是一個極好的資訊源,它包括下載、Ant 手冊以及指向其他參考
資料的連結。
· 查詢關於 Ant 的IDE 和編輯器整合的更多資訊。
· 瞭解關於 Eclipse 這個通用工具平臺的更多資訊。
· developerWorks 開放原始碼專案專區包含豐富的基於 Eclipse 的內容。
· 如果您是 XML 新手,請訪問developerWorksXML 專區。
· Cygwin 是一個用於Windows 的類 Linux 環境。
· CVS 版本控制的開放標準。
· 瞭解關於 WebSphere Studio Application Developer的更多資訊,它基於 Eclipse 平臺。
· 查詢關於 WebSphere Application ServerAnt 對Ant 任務的支援的更多資訊。
· 在“JAR files revealed”中探索 JAR 檔案格式的強大能力(developerWorks,2003 年 10
月)。
· developerWorks 特別貢獻了許多關於Ant 的文章:
o “Incremental development with Ant and JUnit”,Malcolm Davis 撰稿,(2000
年 11 月)。
o “Extending Ant to support interactive builds”,Anthony Young-Garner 撰
稿,(2001 年 11 月)。
o “Enhance Ant with XSL transformations”,Jim Creasman 撰稿(2003 年 9 月)。
· Ant 還支援開放原始碼的Jikes 編譯器和GNU Compiler for Java(GCJ)。
· 在 developerWorks Java 技術專區可以找到關於 Java 程式設計的方方面面的數百篇文章。
· 還可以參閱Java 技術專區教程主頁,從developerWorks 獲得免費的 Java 相關教程的完
整列表。
[完]

相關文章