1. 程式人生 > >ANT詳解及執行小例子

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 表示專案的描述
3.2 property 屬性

一個專案可以有很多的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 被執行。
還可以寫為這樣的格式: <target name="D" depends="C,B,A"/>,執行順序和上面的一樣。另外,一個target 只能執行一次,即使有多個target 依賴於它,也只執行一次。

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">
如果沒有if 或者else,target 總會被執行。


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。