一、概述
ant 是一個將軟件編譯、測試、部署等步驟聯系在一起加以自動化的一個工具,大多用於Java環境中的軟件開發。在實際軟件開發中,有很多地方可以用到ant。
開發環境:
二、優點
ant 是Apache軟件基金會JAKARTA目錄中的一個子項目,它有以下的優點: 1、跨平台性:Ant是純Java語言編寫的,所以具有很好的跨平台性。 2、操作簡單:Ant是由一個內置任務和可選任務組成的,用ant任務就像是在dos中寫命令行一樣。Ant運行時需要一個XML文件(構建文件)。 Ant通過調用target樹,就可以執行各種task。每個task實現了特定接口對象。 3、維護簡單、可讀性好、集成簡單:由於Ant構建文件 時XML格式的文件,所以很容易維護和書寫,而且結構很清晰。Ant可以集成到開發環境中。由於Ant的跨平台性和操作簡單的特點,它很容易集成到一些開發環境中去。
三、安裝和配置
1、下載ant,http://mirror.esocc.com/apache//ant/binaries/apache-ant-1.9.1-bin.zip
2、解壓zip壓縮包,將壓縮包放置你要放置的目錄。我這里放置在D:\apache-ant-1.9.1,目錄結構如下:
bin是ant的程序運行入口,如果沒有配置ANT_HOME的情況下,可以通過bin目錄中的bat程序進行運行build任務。
如:在cmd中運行ant.bat就可以執行程序,當然你選擇要當前目錄中存在一個build.xml(build.xml是默認的ant執行文件,當然你可以指定其他文件)
etc目錄中存放的都是一些xsl的輸出模板,創建一個加強的導出各種任務的XML輸出,使你的build文件擺脫過時的警告
lib目錄中存放的是ant程序需要依賴的jar包
manual目錄是ant程序的幫助文檔
3、在我的電腦 –> 右鍵屬性 –> 高級系統配置 -> 環境變量 中配置ant
新建系統變量 ANT_HOME = D:\apache-ant-1.9.1
這樣環境變量就配置好了,但前提你需要配置jdk的環境變量。如果你沒有配置jdk的環境變量,那么請你先配置好jdk變量。jdk環境配置方法如下:
(1),安裝JDk到其默認目錄:C:\Program Files\Java\jdk1.5.0_05 (沒有jdk去官方下載一個) C:\Program Files\Java\jdk1.5.0 作用:告訴系統JVM在什么地方
(2),右擊我的電腦,選屬性,高級,環境變量 (3),在系統變量欄點新建,出現新建系統變量對話框,在變量名中填上JAVA_HOME ,變量值:C:\Program Files\Java\jdk1.5.0_05 (4),確定后在系統變量(S)欄再新建一個環境變量CLASSPATH,變量值:.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar(開頭的dot和;不能少) (5),確定后在系統變量(S)欄查找並選中變量為Path的選項,點編輯在變量值(V)的末尾添加: %JAVA_HOME%\bin
如果沒有找到PATH變量,自己新建一個! 如果你不想每次運行都要cmd到class所在目錄然后執行java命令,可以把所有的class文件放到統一的目錄組織下,然后將此目錄也追加到CLASSPATH下。
測試代碼如下:
用記事本編輯后存為Test.java(文件名與類名相同)文件,打開命令行窗口, cd到文件所在目錄下:
如果輸出為:Hello World! OK,配置完畢,否則,重新檢查。
四、測試ant
在啟動,運行cmd的dos窗口中輸入ant,如圖:
如果出現這個,那么恭喜你安裝成功了!否則就失敗了,檢查下前面的步驟有沒有錯誤。上面命令會執行ant程序,ant默認執行build.xml中的任務,這里在Administrator目錄中沒有這個文件。
如果安裝失敗,你看看是否存在一些情況:
1、沒有配置JAVA_HOME 或配置錯誤,並且JAVA_HOME\bin\java.exe存在
2、沒有配置ANT_HOEM 或配置錯誤,並且ANT_HOME\bin\ant.bat存在
3、檢查你的環境變量的path變量中,有木有配置...;%ANT_HOME%\bin;...
%PATH%=...maybe-other-entries...;%ANT_HOME%\bin;...maybe-other-entries...
五、ant的運行時環境
ant在運行命令的時候,有時候會出現一些公園的jar庫。這些庫會存在於每個ant工程中,那么這個時候我們可以把這個jar包放到ant_home\lib目錄中作為全局的庫使用。
如果你不想“污染”原始的ant程序,那么你可以把jar包放在當前windows用戶的目錄下,具體位置應該是${user.home}/.ant/lib 下。沒有以上目錄可以手動建立。
如果你只是臨時要添加lib,又不想把lib添加到當前ant工程中。你可以在運行ant程序的時候指定依賴的lib參數。
同時,你還可以在當前build工程的classpath目錄中添加你的工程依賴jar包。
六、ant命令
語法元素說明如下: -help 顯示描述ant 命令及其選項的幫助信息 -projecthelp 顯示包含在構建文件中的、所有用戶編寫的幫助文檔。即為各個<target>中description 屬性的文本,以及包含在<description>元素中的任何文本。將有description 屬性的目標列為主目標(Main target),沒有此屬性的目標則列為子目標(Subtarget)。 -version 要求ant 顯示其版本信息,然后退出。 -quiet 抑制並非由構建文件中的echo 任務所產生的大多數消息。 -verbose 顯示構建過程中每個操作的詳細消息。此選項與-debug 選項只能選其一。 -debug 顯示Ant 和任務開發人員已經標志為調試消息的消息。此選項與-verbose 只能選其一。 -emacs 對日志消息進行格式化,使它們能夠很容易地由Emacs 的shell 模式(shellmode)所解析;也就是說,打印任務事件,但並不縮排,在其之前也沒有[taskname]。 -logfile filename 將日志輸出重定向到指定文件。 -logger classname 指定一個類來處理Ant 的日志記錄。所指定的類必須實現了org.apache.tools.ant.BuildLogger 接口。 -listener classname 為Ant 聲明一個監聽類,並增加到其監聽者列表中。在Ant與IDE或其他Java程序集成時,此選項非常有用。可以閱讀第六章以了解有關監聽者的更多信息。必須將所指定的監聽類編寫為可以處理Ant 的構建消息接發。 -buildfile filename 指定Ant 需要處理的構建文件。默認的構建文件為build.xml。 -Dproperty=value 在命令行上定義一個特性名-值對。 -find filename 指定Ant 應當處理的構建文件。與-buildfile 選項不同,如果所指定文件在當前目錄中未找到,-find 就要求Ant 在其父目錄中再進行搜索。這種搜索會繼續在其祖先目錄中進行,直至達到文件系統的根為止,在此如果文件還未找到,則構建失敗。 -atuoproxy jdk1.5以上的可以使用代理設置 -nouserlib 運行ant時不使用用戶lib中的jar包 -nice 設計主線程優先級 -logfile 使用指定的log日志 -noinput 不允許交互輸入 -keep-going, -k 執行不依賴於所有目標 -propertyfile 加載所有屬性配置文件 -d 屬性文件優先
注意: ● 所有構建文件都要有<project>元素,而且至少有一個<target> 元素。 ● 對於<project> 元素的default 屬性並不一定需要默認值。 ● 構建文件並不一定要被命名為build.xml。不過build.xml 是ant 要搜索的默認文件名。 ● 每個構建文件只能有一個<project> 元素。
在cmd窗口中進入到當前build.xml目錄
在當前目錄下的build.xml運行Ant,執行缺省的target。
在當前目錄下的build-test.xml運行Ant,執行缺省的target。
在當前目錄下的build-test.xml運行Ant,執行一個叫做clean的target。
在當前目錄下的build-test.xml運行Ant,執行一個叫做clean的target,並設定build屬性的值為build/classes。
七、ant腳本:使用節點、元素和屬性、命令指令
1、project 節點元素
project 元素是 Ant 構件文件的根元素, Ant 構件文件至少應該包含一個 project 元素,否則會發生錯誤。在每個 project 元素下,可包含多個 target 元素。接下來向讀者展示一下 project 元素的各屬性。 ● name 屬性:用於指定 project 元素的名稱。 ● default 屬性:用於指定 project 默認執行時所執行的 target 的名稱。 ● basedir 屬性:用於指定基路徑的位置。該屬性沒有指定時,使用 Ant 的構件文件的附目錄作為基准目錄。
從上例可以看出,在這里定義了default 屬性的值為print-dir,即當運行ant 命令時,如果沒有指明執行的target,則將執行默認的target(print-dir)。此外,還定義了basedir 屬性的值為 “.” ,.表示當前目錄,進入當前目錄后運行ant 命令,得一下結果:
2、target節點元素
target為ant的基本執行單元或是任務,它可以包含一個或多個具體的單元/任務。多個target 可以存在相互依賴關系。它有如下屬性: ● name 屬性:指定 target 元素的名稱,這個屬性在一個 project 元素中是唯一的。我們可以通過指定 target 元素的名稱來指定某個 target 。 ● depends 屬性:用於描述 target 之間的依賴關系,若與多個 target 存在依賴關系時,需要以“,”間隔。 Ant 會依照 depends 屬性中 target 出現的順序依次執行每個 target ,被依賴的target 會先執行。 ● if 屬性:用於驗證指定的屬性是存在,若不存在,所在 target 將不會被執行。 ● unless 屬性:該屬性的功能與 if 屬性的功能正好相反,它也用於驗證指定的屬性是否存在,若不存在,所在 target 將會被執行。 ● description 屬性:該屬性是關於 target 功能的簡短描述和說明。 示例:
從以下結果后可以看到,我們運行的是名為 print的target ,由於它依賴於version這個target任務,所以 version將首先被執行,同時因為系統配置了JDK,所以 ant.java.version 屬性存在,執行了version,輸出信息:"[echo] Java Version: 1.6 ",version執行完畢后,接着執行 print,因為docs不存在,而unless屬性是在不存在時進入所在target 的,由此可知 print得以執行,輸出信息:"[echo] The base dir is:D:\Workspace\AntExample\build"。
3、property屬性節點元素
property元素可看作參量或者參數的定義,project 的屬性可以通過 property 元素來設定,也可在 Ant 之外設定。若要在外部引入某文件,例如 build.properties 文件,可以通過如下內容將其引: <property file="build.properties"/> property 元素可用作 task 的屬性值。在 task 中是通過將屬性名放在${屬性名}之間,並放在 task 屬性值的位置來實現的。 Ant 提供了一些內置的屬性,它能得到的系統屬性的列表與 Java 文檔中 System.getProperties() 方法得到的屬性一致,這些系統屬性可參考 sun 網站的說明。同時, Ant 還提供了一些它自己的內置屬性,如下: basedir: project 基目錄的絕對路徑; ant.file: buildfile的絕對路徑,上例中ant.file值為D:\Workspace\AntExample\build; ant.version: Ant 的版本信息,本文為1.8.1 ; ant.project.name: 當前指定的project的名字,即前文說到的project的name屬性值; ant.java.version: Ant 檢測到的JDK版本,本文為 1.6 。
舉例說明如下:
上例中用戶設置了名為name 和age的兩個屬性,這兩個屬性設置后,在下文中可以通過 ${name} 和 ${age} 分別取得這兩個屬性值。
4、copy命令
copy主要用來對文件和目錄的復制功能。舉例如下: ● 復制單個文件:
● 對文件目錄進行復制:
● 將文件復制到另外的目錄:
5、delete命令
對文件或目錄進行刪除,舉例如下:
● 刪除某個文件:
● 刪除某個目錄:
● 刪除所有的jar文件或空目錄:
6、 mkdir 命令
創建目錄。
7、 move 命令
移動文件或目錄,舉例如下: ● 移動單個文件:
● 移動單個文件到另一個目錄:
● 移動某個目錄到另一個目錄:
8、echo 命令
該任務的作用是根據日志或監控器的級別輸出信息。它包括 message 、 file 、 append 和 level 四個屬性,舉例如下 <echo message="ant message" file="/logs/ant.log" append="true">
9、jar 標簽節點元素
該標簽用來生成一個JAR文件,其屬性如下。 ● destfile表示JAR文件名。 ● basedir表示被歸檔的文件名。 ● includes表示別歸檔的文件模式。 ● exchudes表示被排除的文件模式。
● compress表示是否壓縮。
示例:
上面的mainfest是jar包中的MEAT-INF中的MANIFEST.MF中的文件內容
同樣打包操作的的還有war、tgz,已經解壓操作uzip
10、javac 標簽節點元素
該標簽用於編譯一個或一組java文件,其屬性如下。 ● srcdir表示源程序的目錄。 ● destdir表示class文件的輸出目錄。 ● include表示被編譯的文件的模式。 ● excludes表示被排除的文件的模式。 ● classpath表示所使用的類路徑。 ● debug表示包含的調試信息。 ● optimize表示是否使用優化。 ● verbose 表示提供詳細的輸出信息。 ● fileonerror表示當碰到錯誤就自動停止。
示例
11、java 標簽節點元素
該標簽用來執行編譯生成的.class文件,其屬性如下。 ● classname 表示將執行的類名。 ● jar表示包含該類的JAR文件名。 ● classpath所表示用到的類路徑。 ● fork表示在一個新的虛擬機中運行該類。 ● failonerror表示當出現錯誤時自動停止。 ● output 表示輸出文件。 ● append表示追加或者覆蓋默認文件。
示例
12、arg 數據參數元素
由Ant構建文件調用的程序,可以通過<arg>元素向其傳遞命令行參數,如apply,exec和java任務均可接受嵌套<arg>元素,可以為各自的過程調用指定參數。以下是<arg>的所有屬性。 ● values 是一個命令參數。如果參數中有空格,但又想將它作為單獨一個值,則使用此屬性。 ● file 表示一個參數的文件名。在構建文件中,此文件名相對於當前的工作目錄。 ● line 表示用空格分隔的多個參數列表。 ● 表示路徑,一個作為單個命令行變量的path-like的字符串;或作為分隔符,Ant會將其轉變為特定平台的分隔符。 ● pathref 引用的path(使用path元素節點定義path)的id ● prefix 前綴 ● suffix 后綴
例子
是一個含有空格的單個的命令行變量。
是兩個空格分隔的命令行變量。
是一個命令行變量,其值在DOS系統上為\dir;\dir2;\dir3;在Unix系統上為/dir:/dir2:/dir3 。
13、ervironment 類型
由Ant構建文件調用的外部命令或程序,<env>元素制定了哪些環境變量要傳遞給正在執行的系統命令,<env>元素可以接受以下屬性。 ● file表示環境變量值的文件名。此文件名要被轉換位一個絕對路徑。 ● path表示環境變量的路徑。Ant會將它轉換為一個本地約定。 ● value 表示環境變量的一個直接變量。 ● key 表示環境變量名。 注意 file path 或 value只能取一個。
14、filelist 文件集合列表
filelist 是一個支持命名的文件列表的數據類型,包含在一個filelist類型中的文件不一定是存在的文件。以下是其所有的屬性。 ● dir是用於計算絕對文件名的目錄。 ● files 是用逗號分隔的文件名列表。 ● refid 是對某處定義的一個<filelist>的引用。 注意 dir 和 files 都是必要的,除非指定了refid(這種情況下,dir和files都不允許使用)。
示例
15、fileset 文件類型
fileset 數據類型定義了一組文件,並通常表示為<fileset>元素。不過,許多ant任務構建成了隱式的fileset,這說明他們支持所有的fileset屬性和嵌套元素。以下為fileset 的屬性列表。 ● dir表示fileset 的基目錄。 ● casesensitive的值如果為false,那么匹配文件名時,fileset不是區分大小寫的,其默認值為true. ● defaultexcludes 用來確定是否使用默認的排除模式,默認為true。 ● excludes 是用逗號分隔的需要派出的文件模式列表。 ● excludesfile 表示每行包含一個排除模式的文件的文件名。 ● includes 是用逗號分隔的,需要包含的文件模式列表。 ● includesfile 表示每行包括一個包含模式的文件名。
示例
16、patternset 類型
fileset 是對文件的分組,而patternset是對模式的分組,他們是緊密相關的概念。
<patternset>支持4個屬性:includes、excludex、includexfile、excludesfile,這些與fileset相同。
patternset 還允許以下嵌套元素:include,exclude,includefile 和 excludesfile.
示例
17、filterset 類型
filterset定義了一組過濾器,這些過濾器將在文件移動或復制時完成文件的文本替換。 主要屬性如下: ● begintoken 表示嵌套過濾器所搜索的記號,這是標識其開始的字符串。 ● endtoken 表示嵌套過濾器所搜索的記號這是標識其結束的字符串。 ● id 是過濾器的唯一標志符。 ● refid 是對構建文件中某處定義一個過濾器的引用。
示例
18、path類型
path元素用來表示一個類路徑,不過它還可以用於表示其他的路徑。在用作幾個屬性時,路經中的各項用分號或冒號隔開。在構建的時候,此分隔符將代替當前平台中所有的路徑分隔符,其擁有的屬性如下。 ● location 表示一個文件或目錄。Ant在內部將此擴展為一個絕對路徑。 ● refid 是對當前構建文件中某處定義的一個path的引用。 ● path表示一個文件或路徑名列表。
示例
八、ant編譯打包、運行工程
要說的的東西基本上就那么多,ant還有很多內容沒有提到,有興趣的可以自己去研究研究。ant不難,你用它就像是在docs控制台輸入命令行一樣,只不過ant是將命令行轉換為xml的腳本信息,可以進行重復的運行。在一定情況下,提高了效率和重復的工作。