ANT詳解及執行小例子
1.ANT介紹
1.1 什麼是Ant?
Apache Ant 是一個將軟體編譯、測試、部署等步驟聯絡在一起加以優化的一個構建工具,常用於Java 環境中的軟體開發。
Ant 的預設配置檔案是build.xml。
1.2 什麼是構建?
形象的說,構建就是把程式碼從某個地方拿來、編譯、再拷貝到某個地方去等操作,當然不僅於此,但是主要用來幹這個。
1.3Ant 的優勢?
(1)跨平臺:因為 ant 是使用 java 實現的,所以跨平臺;
(2)使用簡單:比其他構建工具簡單,特別是和 ant 的兄弟 make 做比較;
(3)語法清晰:同樣是和 make 做比較;
(4)功能強大:Ant 能做的事情很多,可能你用了很久,你仍然不知道它能有多少功能。當你需要自己開發一些 ant 外掛的時候,你會發現它更多的功能。
Ant 於Make 的區別:make 是一個類似於Ant 的構建工具,不過make 應用於C/C++,Ant 則主要應用於java。當然這不是定的,當大部分人如此。
2. 自己寫的一個例子。
2.1 首先你建個java 專案。就寫個Hello ant的小程式碼就可以了~,這就不說了。
然後在寫一個build.xml檔案。具體內容如下:
<?xml version="1.0" encoding="UTF-8"?> <!-- (1) 建一個src 資料夾,然後寫一個HelloWorld.java,按照包結構目錄放進去; (2) 寫build.xml 檔案 (3) 在命令列輸入 cmd, ant 做測試。 --> <project name="Ant_Testing" default="run" basedir="."> <property name="src" value="src"/> <property name="dest" value="classes"/> <property name="hello_jar" value="hello.jar"/> <target name="init"> <mkdir dir="${dest}"/> </target> <target name="compile" depends="init"> <javac srcdir="${src}" destdir="${dest}"/> </target> <!-- 打jar 包 --> <target name="jar" depends="compile"> <jar destfile="${hello_jar}" basedir="${dest}"></jar> </target> <!-- 執行jar 包內的程式--> <target name="run" depends="jar"> <java classname="ant.HelloAnt" classpath="${hello_jar}"/> </target> <!-- 刪除生成檔案--> <target name="clean"> <delete dir="${dest}"/> <delete file="${hello_jar}"/> </target> <!-- 再次執行,這裡顯示瞭如何在一個 target 裡邊呼叫其他的 target --> <target name="return" depends="clean,run"> <ant target="clean"/> <ant target="run"/> </target> </project>
ant 中的每一個任務都可以這樣執行,ant + target name
3.核心概念詳解
3.1 project 屬性
Attribute | Description | Required |
name | 專案名稱,可自由定義。 | 否 |
default | 定義一個預設(預設)的target,當我們執行沒有指定 target 的build.xml 時,就會執行這個預設的target。 |
是 |
basedir | 用於定義專案的基路徑。 | 否 |
description | 表示專案的描述 | 否 |
一個專案可以有很多的property。可以在buildfile 中用property task 來設定,或者在ant 之外設定。一個property 有一個名字和一個值。Property 可以用於task 的屬性值。這是通過將屬性名放在“${}”之間並放在屬性值的位置來實現的。例如有一個property builddir 的值是“build”,這
個property 就可用於屬性值:${builddir}/classes。這個值就可被解析為 build/class。
典型的如第一講中的例子,
首先設定property:
<property name="src" value="src" />
<property name="dest" value="classes" />
然後在其他地方引用property:
<target name="compile" depends="init">
<javac srcdir="${src}" destdir="${dest}" />
</target>
3.3 內建屬性
除了Java 的內建屬性外,Ant 還定義了一些自己的內建屬性:
Attribute | Description |
basedir | 可以理解為project 專案的絕對路徑,於<project>中的 basedir 屬性一樣 |
ant.file | buildfile 的絕對路徑 |
ant.version | ant 的版本 |
ant.propertie.name | 當前執行的project 的名字,由<project>的name 屬性設定 |
ant.java.version | ant 檢測到的jvm 版本。 |
3.4 target 屬性
Attribute | Description | Required |
name | target 的名字。 | 是 |
depends | 用逗號分隔的target 的名字列表,也就是依賴列表 | 否 |
if | 執行target 需要清除設定的屬性名 | 否 |
unless | 執行target 需要清除設定的屬性名 | 否 |
description | 描述target 的功能,這些描述可由-projexthelp 命令列 輸出。 |
否 |
3.4.1
depends
target 中的depends 屬性指定了target 的執行順序,也就是說一個target 可以依賴其他的target。Ant 會依照depends 屬性中的target 出現順序依次執行每個target。在執行前,首先需要執行它所依賴的target。例如,有一個用於編譯的target,一個用於生成執行檔案的target。在生成執行檔案之前必須先編譯通過,所以生成可執行檔案的target 依賴於編譯target。Ant 會處理這種依賴關係。我們還要注意到,Ant
的depends 屬性只指定了target應該被執行的順序。如果被依賴的target無法執行,這種 depends 對於指定了依賴關係的其他target 沒有影響。Ant 會依照depends 屬性中target 出現的順序依次執行每個target。然而,要記住的是隻要某個target 依賴於一個target,後者就會被先執行。看下面的例子。
<target name="A"/> <target name="B" depends="A"/> <target name="C" depends="B"/> <target name="D" depends="C "/> |
假設我們預設的target 是D,因為D 依賴於C, C 依賴於B,B 依賴於A。所以先執行A,再執 行B,然後是C,最後D 被執行。 |
2.4.2 if / unless
如果執行某個target,由某些屬性是否被設定來決定。這樣,就能根據系統的狀態(java version,OS, 命令列屬性定義等等)來更好的控制build 的過程。要想讓一個target 這樣做,你就應該在target元素中,加入if 或unless 屬性,帶上target 應該有所判斷的屬性。看下面的例子。
<target name="install-windows" if="osfamily-windows"> <target name="install-unix" if="osfamily-unix"> |
3.5 task 屬性
一個task 是一段可執行的程式碼。task 可以有多個屬性(也可以叫變數)。屬性值可能包含對property 的引用。這些應用會在task 執行前被解析。
<target name="compile" depends="init"> <javac srcdir="${src}" destdir="${dest}" /> </target> 其中的<javac srcdir="${src}" destdir="${dest}" /> 就是一個task。 其中的 ${src} 就是對前面定義的property 的引用。再執行javac 之前這些${*} 會被解析。 |
下面是task 的一般構造形式:
<name attribute1=”value1” attribute2=”value2” … />
這裡name 是task 的名字,attribute 是屬性名,value 是屬性值。
另外,我們可以使用內建的task 和一些可選的task,我們也可以編寫自己的task。