前言
Apache Ant,是一個將軟件編譯、測試、部署等步驟聯繫在一塊兒加以自動化的一個工具,大多用於Java環境中的軟件開發。由Apache軟件基金會所提供。html
Ant是純Java語言編寫的,因此具備很好的跨平臺性。java
1 下載和安裝
1.1 下載
ant的官方下載地址:http://ant.apache.org/bindownload.cgiapache
進入頁面後,在下圖的紅色方框中能夠下載最新版本。筆者下載的版本是 apache-ant-1.9.4。app
1.2 配置環境變量
配置環境變量(個人電腦 -> 屬性 -> 高級 -> 環境變量)。less
設置ant環境變量:工具
ANT_HOME
C:/ apache-ant-1.9.4
path C:/ apache-ant-1.9.4/bin測試
classpath C:/apache-ant-1.9.4/lib網站
1.3 驗證
點擊 開始 -> 運行 -> 輸入cmd
執行構建文件ui
輸入以下命令:ant
若是出現以下內容,說明安裝成功:this
Buildfile: build.xml does not exist!
Build failed
注意:由於ant默認運行build.xml文件,這個文件須要咱們建立。
若是不想命名爲build.xml,運行時可使用 ant -buildfile test.xml 命令指明要運行的構建文件。
查看版本信息
輸入 ant -version,能夠查看版本信息。
![](http://static.javashuo.com/static/loading.gif)
但若是出現 'ant' 不是內部或外部命令,也不是可運行的程序或批處理文件
說明安裝失敗:(能夠重複前述步驟,直至安裝成功。)
2 例子
在安裝和配置成功後,咱們就可使用ant了。
爲了讓讀者對ant有一個直觀的認識,首先以Ant官方手冊上的一個簡單例子作一個說明。
如下是一個build.xml文件的內容:
<
project
name
="MyProject"
default
="dist"
basedir
="."
>
<
description
>
simple example build file
</
description
>
<!--
set global properties for this build
-->
<
property
name
="src"
location
="src"
/>
<
property
name
="build"
location
="build"
/>
<
property
name
="dist"
location
="dist"
/>
<
target
name
="init"
>
<!--
Create the time stamp
-->
<
tstamp
/>
<!--
Create the build directory structure used by compile
-->
<
mkdir
dir
="${build}"
/>
</
target
>
<
target
name
="compile"
depends
="init"
description
="compile the source "
>
<!--
Compile the java code from ${src} into ${build}
-->
<
javac
srcdir
="${src}"
destdir
="${build}"
/>
</
target
>
<
target
name
="dist"
depends
="compile"
description
="generate the distribution"
>
<!--
Create the distribution directory
-->
<
mkdir
dir
="${dist}/lib"
/>
<!--
Put everything in ${build} into the MyProject-${DSTAMP}.jar file
-->
<
jar
jarfile
="${dist}/lib/MyProject-${DSTAMP}.jar"
basedir
="${build}"
/>
</
target
>
<
target
name
="clean"
description
="clean up"
>
<!--
Delete the ${build} and ${dist} directory trees
-->
<
delete
dir
="${build}"
/>
<
delete
dir
="${dist}"
/>
</
target
>
</
project
>
在這個xml文件中,有幾個target標籤,每一個target對應一個執行目標。
咱們將這個build.xml放在 D:\Temp\ant_test 路徑下,而後在dos界面下進行測試。
ant init
在 D:\Temp\ant_test 路徑下建立了一個build目錄,執行成功。
ant compile
提示錯誤,原來是在build.xml的所在目錄下找不到src目錄。好的,咱們直接建立一個src目錄,而後再次嘗試。
此次,執行成功。
ant dist
在 D:\Temp\ant_test 路徑下建立了一個dist目錄,執行成功。
ant clean
清除建立的build和dist目錄,執行成功。
一個細節
細心的讀者,想必已經發現一個問題——在執行 ant compile 和 ant dist 命令的時候把前面的命令也執行了。這是爲何呢?
請留意一下build.xml中的內容。有部分 target 標籤中含有 depends 關鍵字。
這代表,當前的 target 在執行時須要依賴其餘的target,必須先執行依賴的target,而後再執行。
3 關鍵元素
Ant的構件文件都是XML格式的。每一個構件文件包含一個project元素和至少一個target。
target元素能夠包含多個task元素。
3.1 Project 元素
project 元素是構建文件的根元素。
一個 project 元素能夠有多個 target 元素,一個 target 元素能夠有多個 task。
在上節的例子中,project標籤裏有三個屬性。
<
project
name
="MyProject"
default
="dist"
basedir
="."
>
name屬性,指示 project 元素的名字。例子中的名字就是 MyProject。
default屬性,指示這個 project 默認執行的 target。在本文的例子中,默認執行的 target 爲 dist。
若是咱們輸入命令 ant 時,不指定 target 參數,默認會執行 dist 這個 target。
basedir屬性,指定根路徑的位置。該屬性沒有指定時,使用Ant的構件文件的所在目錄做爲根目錄。
3.2 Target 元素
target 元素是 task 的容器,也就是 Ant 的一個基本執行單元。
以上節例子中的 compile 來舉例。
<
target
name
="compile"
depends
="init"
description
="compile the source "
>
<!--
Compile the java code from ${src} into ${build}
-->
<
javac
srcdir
="${src}"
destdir
="${build}"
/>
</
target
>
這個 target 中出現了幾個屬性。
name屬性,指示target元素的名稱。
這個屬性在一個project元素中必須是惟一的。這很好理解,若是出現重複,Ant就不知道具體該執行哪一個 target 了。
depends屬性,指示依賴的 target,當前的 target 必須在依賴的 target 以後執行。
description屬性,是關於 target 的簡短說明。
此外,還有其餘幾個未出如今構建文件中的屬性。
if屬性,驗證指定的屬性是否存在,若不存在,所在target將不會被執行。
unless屬性,正好和 if屬性相反,驗證指定的屬性是否存在,若存在,所在target將不會被執行。
extensionOf屬性,添加當前 target 到 extension-point 依賴列表。——Ant1.8.0新特性。
extension-point 元素和 target 元素十分相似,均可以指定依賴的target。可是不一樣的是,extension-point 中不能包含任何 task。
請看如下實例:
<
target
name
="create-directory-layout"
>
...
</
target
>
<
extension-point
name
="ready-to-compile"
depends
="create-directory-layout"
/>
<
target
name
="compile"
depends
="ready-to-compile"
>
...
</
target
>
調用target順序: create-directory-layout --> 'empty slot' --> compile
<
target
name
="generate-sources"
extensionOf
="ready-to-compile"
>
...
</
target
>
調用target順序: create-directory-layout --> generate-sources --> compile
onMissingExtensionPoint屬性:當沒法找到一個extension-point時,target嘗試去作的動做("fail", "warn", "ignore")。
——Ant1.8.2新特性。
3.3 Task 元素
task是一段能夠被執行的代碼。
一個task能夠有多個屬性, 一個屬性能夠包含對一個 property 的引用。
task的一般結構爲
<
name
attribute1
="value1"
attribute2
="value2"
...
/>
其中,name 是 task 的名字, attributeN 是屬性名, valueN 是這個屬性的值。
仍是以 compile 作爲例子:
<
target
name
="compile"
depends
="init"
description
="compile the source "
>
<!--
Compile the java code from ${src} into ${build}
-->
<
javac
srcdir
="${src}"
destdir
="${build}"
/>
</
target
>
在 compile 這個 target 標籤中包含了一個任務。
這個任務的動做是:執行JAVA編譯,編譯src下的代碼,並把編譯生成的文件放在build目錄中。
經常使用task
javac:用於編譯一個或者多個Java源文件,一般須要srcdir和destdir兩個屬性,用於指定Java源文件的位置和編譯後class文件的保存位置。
<
javac
srcdir
="${src}"
destdir
="${build}"
classpath
="abc.jar"
debug
="on"
source
="1.7"
/>
java:用於運行某個Java類,一般須要classname屬性,用於指定須要運行哪一個類。
<
java
classname
="test.Main"
>
<
arg
value
="-h"
/>
<
classpath
>
<
pathelement
location
="dist/test.jar"
/>
</
classpath
>
</
java
>
jar:用於生成JAR包,一般須要指定destfile屬性,用於指定所建立JAR包的文件名。除此以外,一般還應指定一個文件集,代表須要將哪些文件打包到JAR包裏。
<
jar
jarfile
="${dist}/lib/MyProject-${DSTAMP}.jar"
basedir
="${build}"
/>
echo:輸出某個字符串。
<
echo
message
="Building to ${builddir}"
/>
<
echo
>You are using version ${java.version}
of Java! This message spans two lines.
</
echo
>
copy:用於複製文件或路徑。
<
copy
todir
="${builddir}/srccopy"
>
<
fileset
dir
="${srcdir}"
>
<
include
name
="**/*.java"
/>
</
fileset
>
<
filterset
>
<
filter
token
="VERSION"
value
="${app.version}"
/>
</
filterset
>
</
copy
>
delete:用於刪除文件或路徑。
<
delete
file
="/lib/ant.jar"
/>
<
delete
dir
="lib"
/>
<
delete
>
<
fileset
dir
="."
includes
="**/*.bak"
/>
</
delete
>
mkdir:用於建立文件夾。
<
mkdir
dir
="${dist}/lib"
/>
move:用戶移動文件和路徑。
<
move
todir
="some/new/dir"
>
<
fileset
dir
="my/src/dir"
>
<
include
name
="**/*.jar"
/>
<
exclude
name
="**/ant.jar"
/>
</
fileset
>
</
move
>
3.4 Property 元素
Property 是對參數的定義。
project的屬性能夠經過property元素來設定,也可在Ant以外設定。若要在外部引入某文件,例如build.properties文件,能夠經過以下內容將其引入:<property file=」 build.properties」/>。
property元素可用做 task 的屬性值。在task中是經過將屬性名放在「${」和「}」之間,並放在task屬性值的位置來實現的。
例如 complile 例子中,使用了前面定義的 src 做爲源目錄。
<
javac
srcdir
="${src}"
destdir
="${build}"
/>
Ant提供了一些內置的屬性,它能獲得的系統屬性的列表與Java文檔中System.getPropertis()方法獲得的屬性一致,這些系統屬性可參考sun網站的說明。
3.5 extension-point元素
和 target 元素十分相似,均可以指定依賴的target。可是不一樣的是,extension-point 中不能包含任何 task。——Ant1.8.0新增特性。
在 target元素中的例子裏已提到過,再也不贅述。
參考資料
[1] ant官方手冊:http://ant.apache.org/manual/index.html
[2] http://www.blogjava.net/amigoxie/archive/2007/11/09/159413.html