Ant全攻略
轉(zhuǎn)自:
BEA
論壇
powerise
?
1.Ant
是什么?
Ant
是一種基于
Java
和
XML
的
build
工具。
2
下載、安裝
Ant
安裝
Ant
下載
.zip
文件,解壓縮到
c:\ant1.3(
后面引用為
%ANT_HOME%)
2.1
在你運(yùn)行
Ant
之前需要做一些配置工作。
·
將
bin
目錄加入
PATH
環(huán)境變量。
·
設(shè)定
ANT_HOME
環(huán)境變量,指向你安裝
Ant
的目錄。在一些
OS
上,
Ant
的腳本可以猜測(cè)
ANT_HOME
(
Unix
和
Windos NT/2000
)-但最好不要依賴這一特性。
·
可選地,設(shè)定
JAVA_HOME
環(huán)境變量(參考下面的高級(jí)小節(jié)),該變量應(yīng)該指向你安裝
JDK
的目錄。
注意:不要將
Ant
的
ant.jar
文件放到
JDK/JRE
的
lib/ext
目錄下。
Ant
是個(gè)應(yīng)用程序,而
lib/ext
目錄是為
JDK
擴(kuò)展使用的(如
JCE
,
JSSE
擴(kuò)展)。而且通過擴(kuò)展裝入的類會(huì)有安全方面的限制。
2.2
運(yùn)行
Ant
運(yùn)行
Ant
非常簡(jiǎn)單,當(dāng)你正確地安裝
Ant
后,只要輸入
ant
就可以了。
n
沒有指定任何參數(shù)時(shí),
Ant
會(huì)在當(dāng)前目錄下查詢
build.xml
文件。如果找到了就用該文件作為
buildfile
。如果你用
-find
選項(xiàng)。
Ant
就會(huì)在上級(jí)目錄中尋找
buildfile
,直至到達(dá)文件系統(tǒng)的根。要想讓
Ant
使用其他的
buildfile
,可以用參數(shù)
-buildfile file
,這里
file
指定了你想使用的
buildfile
。
n
可以指定執(zhí)行一個(gè)或多個(gè)
target
。當(dāng)省略
target
時(shí),
Ant
使用標(biāo)簽
<project>
的
default
屬性所指定的
target
。
命令行選項(xiàng)總結(jié):
ant [options] [target [target2 [target3] ...]]
Options:
-help print this message
-projecthelp print project help information
-version print the version information and exit
-quiet be extra quiet
-verbose be extra verbose
-debug print debugging information
-emacs produce logging information without adornments
-logfile file use given file for log output
-logger classname the class that is to perform logging
-listener classname add an instance of class as a project listener
-buildfile file use specified buildfile
-find file search for buildfile towards the root of the filesystem and use the first one found
-Dproperty=value set property to value
例子
ant
使用當(dāng)前目錄下的
build.xml
運(yùn)行
Ant
,執(zhí)行缺省的
target
。
ant -buildfile test.xml
使用當(dāng)前目錄下的
test.xml
運(yùn)行
Ant
,執(zhí)行缺省的
target
。
ant -buildfile test.xml dist
使用當(dāng)前目錄下的
test.xml
運(yùn)行
Ant
,執(zhí)行一個(gè)叫做
dist
的
target
。
ant -buildfile test.xml -Dbuild=build/classes dist
使用當(dāng)前目錄下的
test.xml
運(yùn)行
Ant
,執(zhí)行一個(gè)叫做
dist
的
target
,并設(shè)定
build
屬性的值為
build/classes
。
3
編寫
build.xml
Ant
的
buildfile
是用
XML
寫的。每個(gè)
buildfile
含有一個(gè)
project
。
buildfile
中每個(gè)
task
元素可以有一個(gè)
id
屬性,可以用這個(gè)
id
值引用指定的任務(wù)。這個(gè)值必須是唯一的。(詳情請(qǐng)參考下面的
Task
小節(jié))
3.1 Projects
project
有下面的屬性:
Attribute Description Required
name
項(xiàng)目名稱
. No
default
當(dāng)沒有指定
target
時(shí)使用的缺省
target Yes
basedir
用于計(jì)算所有其他路徑的基路徑。該屬性可以被
basedir property
覆蓋。當(dāng)覆蓋時(shí),該屬性被忽略。如果屬性和
basedir property
都沒有設(shè)定,就使用
buildfile
文件的父目錄。
No
項(xiàng)目的描述以一個(gè)頂級(jí)的
<description>
元素的形式出現(xiàn)(參看
description
小節(jié))。
一個(gè)項(xiàng)目可以定義一個(gè)或多個(gè)
target
。一個(gè)
target
是一系列你想要執(zhí)行的。執(zhí)行
Ant
時(shí),你可以選擇執(zhí)行那個(gè)
target
。當(dāng)沒有給定
target
時(shí),使用
project
的
default
屬性所確定的
target
。
3.2 Targets
一個(gè)
target
可以依賴于其他的
target
。例如,你可能會(huì)有一個(gè)
target
用于編譯程序,一個(gè)
target
用于生成可執(zhí)行文件。你在生成可執(zhí)行文件之前必須先編譯通過,所以生成可執(zhí)行文件的
target
依賴于編譯
target
。
Ant
會(huì)處理這種依賴關(guān)系。
然而,應(yīng)當(dāng)注意到,
Ant
的
depends
屬性只指定了
target
應(yīng)該被執(zhí)行的順序-如果被依賴的
target
無法運(yùn)行,這種
depends
對(duì)于指定了依賴關(guān)系的
target
就沒有影響。
Ant
會(huì)依照
depends
屬性中
target
出現(xiàn)的順序(從左到右)依次執(zhí)行每個(gè)
target
。然而,要記住的是只要某個(gè)
target
依賴于一個(gè)
target
,后者就會(huì)被先執(zhí)行。
<target name="A"/>
<target name="B" depends="A"/>
<target name="C" depends="B"/>
<target name="D" depends="C,B,A"/>
假定我們要執(zhí)行
target D
。從它的依賴屬性來看,你可能認(rèn)為先執(zhí)行
C
,然后
B
,最后
A
被執(zhí)行。錯(cuò)了,
C
依賴于
B
,
B
依賴于
A
,所以先執(zhí)行
A
,然后
B
,然后
C
,最后
D
被執(zhí)行。
一個(gè)
target
只能被執(zhí)行一次,即時(shí)有多個(gè)
target
依賴于它(看上面的例子)。
如果(或如果不)某些屬性被設(shè)定,才執(zhí)行某個(gè)
target
。這樣,允許根據(jù)系統(tǒng)的狀態(tài)(
java version, OS,
命令行屬性定義等等)來更好地控制
build
的過程。要想讓一個(gè)
target
這樣做,你就應(yīng)該在
target
元素中,加入
if
(或
unless
)屬性,帶上
target
因該有所判斷的屬性。例如:
<target name="build-module-A" if="module-A-present"/>
<target name="build-own-fake-module-A" unless="module-A-present"/>
如果沒有
if
或
unless
屬性,
target
總會(huì)被執(zhí)行。
可選的
description
屬性可用來提供關(guān)于
target
的一行描述,這些描述可由
-projecthelp
命令行選項(xiàng)輸出。
將你的
tstamp task
在一個(gè)所謂的初始化
target
是很好的做法,其他的
target
依賴這個(gè)初始化
target
。要確保初始化
target
是出現(xiàn)在其他
target
依賴表中的第一個(gè)
target
。在本手冊(cè)中大多數(shù)的初始化
target
的名字是
"init"
。
target
有下面的屬性:
Attribute Description Required
name target
的名字
Yes
depends
用逗號(hào)分隔的
target
的名字列表,也就是依賴表。
No
if
執(zhí)行
target
所需要設(shè)定的屬性名。
No
unless
執(zhí)行
target
需要清除設(shè)定的屬性名。
No
description
關(guān)于
target
功能的簡(jiǎn)短描述。
No
3.3 Tasks
一個(gè)
task
是一段可執(zhí)行的代碼。
一個(gè)
task
可以有多個(gè)屬性(如果你愿意的話,可以將其稱之為變量)。屬性只可能包含對(duì)
property
的引用。這些引用會(huì)在
task
執(zhí)行前被解析。
下面是
Task
的一般構(gòu)造形式:
<name attribute1="value1" attribute2="value2" ... />
這里
name
是
task
的名字,
attributeN
是屬性名,
valueN
是屬性值。
有一套內(nèi)置的(
built-in
)
task
,以及一些可選
task
,但你也可以編寫自己的
task
。
所有的
task
都有一個(gè)
task
名字屬性。
Ant
用屬性值來產(chǎn)生日志信息。
可以給
task
賦一個(gè)
id
屬性:
<taskname id="taskID" ... />
這里
taskname
是
task
的名字,而
taskID
是這個(gè)
task
的唯一標(biāo)識(shí)符。通過這個(gè)標(biāo)識(shí)符,你可以在腳本中引用相應(yīng)的
task
。例如,在腳本中你可以這樣:
<script ... >
task1.setFoo("bar");
</script>
設(shè)定某個(gè)
task
實(shí)例的
foo
屬性。在另一個(gè)
task
中(用
java
編寫),你可以利用下面的語句存取相應(yīng)的實(shí)例。
project.getReference("task1").
注意
1
:如果
task1
還沒有運(yùn)行,就不會(huì)被生效(例如:不設(shè)定屬性),如果你在隨后配置它,你所作的一切都會(huì)被覆蓋。
注意
2
:未來的
Ant
版本可能不會(huì)兼容這里所提的屬性,因?yàn)楹苡锌赡芨緵]有
task
實(shí)例,只有
proxies
。
3.4 Properties
一個(gè)
project
可以有很多的
properties
。可以在
buildfile
中用
property task
來設(shè)定,或在
Ant
之外設(shè)定。一個(gè)
property
有一個(gè)名字和一個(gè)值。
property
可用于
task
的屬性值。這是通過將屬性名放在
"${"
和
"}"
之間并放在屬性值的位置來實(shí)現(xiàn)的。例如如果有一個(gè)
property builddir
的值是
"build"
,這個(gè)
property
就可用于屬性值:
${builddir}/classes
。這個(gè)值就可被解析為
build/classes
。
內(nèi)置屬性
如果你使用了
<property> task
定義了所有的系統(tǒng)屬性,
Ant
允許你使用這些屬性。例如,
${os.name}
對(duì)應(yīng)操作系統(tǒng)的名字。
要想得到系統(tǒng)屬性的列表可參考
the Javadoc of System.getProperties
。
除了
Java
的系統(tǒng)屬性,
Ant
還定義了一些自己的內(nèi)置屬性:
basedir project
基目錄的絕對(duì)路徑
(
與
<project>
的
basedir
屬性一樣
)
。
ant.file buildfile
的絕對(duì)路徑。
ant.version Ant
的版本。
ant.project.name
當(dāng)前執(zhí)行的
project
的名字;由
<project>
的
name
屬性設(shè)定
.
ant.java.version Ant
檢測(cè)到的
JVM
的版本;
目前的值有
"1.1", "1.2", "1.3" and "1.4".
???
例子
<project name="MyProject" default="dist" basedir=".">
<!-- set global properties for this build -->
<property name="src" value="."/>
<property name="build" value="build"/>
<property name="dist" value="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">
<!-- Compile the java code from ${src} into ${build} -->
<javac srcdir="${src}" destdir="${build}"/>
</target>
<target name="dist" depends="compile">
<!-- 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">
<!-- Delete the ${build} and ${dist} directory trees -->
<delete dir="${build}"/>
<delete dir="${dist}"/>
</target>
</project>
3.5 Path-like Structures
你可以用
":"
和
";"
作為分隔符,指定類似
PATH
和
CLASSPATH
的引用。
Ant
會(huì)把分隔符轉(zhuǎn)換為當(dāng)前系統(tǒng)所用的分隔符。
當(dāng)需要指定類似路徑的值時(shí),可以使用嵌套元素。一般的形式是
<classpath>
<pathelement path="${classpath}"/>
<pathelement location="lib/helper.jar"/>
</classpath>
location
屬性指定了相對(duì)于
project
基目錄的一個(gè)文件和目錄,而
path
屬性接受逗號(hào)或分號(hào)分隔的一個(gè)位置列表。
path
屬性一般用作預(yù)定義的路徑--其他情況下,應(yīng)該用多個(gè)
location
屬性。
為簡(jiǎn)潔起見,
classpath
標(biāo)簽支持自己的
path
和
location
屬性。所以:
<classpath>
<pathelement path="${classpath}"/>
</classpath>
可以被簡(jiǎn)寫作:
<classpath path="${classpath}"/>
也可通過
<fileset>
元素指定路徑。構(gòu)成一個(gè)
fileset
的多個(gè)文件加入
path-like structure
的順序是未定的。
<classpath>
<pathelement path="${classpath}"/>
<fileset dir="lib">
<include name="**/*.jar"/>
</fileset>
<pathelement location="classes"/>
</classpath>
上面的例子構(gòu)造了一個(gè)路徑值包括:
${classpath}
的路徑,跟著
lib
目錄下的所有
jar
文件,接著是
classes
目錄。
如果你想在多個(gè)
task
中使用相同的
path-like structure
,你可以用
<path>
元素定義他們(與
target
同級(jí)),然后通過
id
屬性引用--參考
Referencs
例子。
path-like structure
可能包括對(duì)另一個(gè)
path-like structurede
的引用(通過嵌套
<path>
元素):
<path id="base.path">
<pathelement path="${classpath}"/>
<fileset dir="lib">
<include name="**/*.jar"/>
</fileset>
<pathelement location="classes"/>
</path>
<path id="tests.path">
<path refid="base.path"/>
<pathelement location="testclasses"/>
</path>
前面所提的關(guān)于
<classpath>
的簡(jiǎn)潔寫法對(duì)于
<path>
也是有效的,如:
<path id="tests.path">
? <path refid="base.path"/>
<pathelement location="testclasses"/>
</path>
可寫成:
<path id="base.path" path="${classpath}"/>
命令行變量
有些
task
可接受參數(shù),并將其傳遞給另一個(gè)進(jìn)程。為了能在變量中包含空格字符,可使用嵌套的
arg
元素。
Attribute Description Required
value
一個(gè)命令行變量;可包含空格字符。
只能用一個(gè)
line
空格分隔的命令行變量列表。
file
作為命令行變量的文件名;會(huì)被文件的絕對(duì)名替代。
path
一個(gè)作為單個(gè)命令行變量的
path-like
的字符串;或作為分隔符,
Ant
會(huì)將其轉(zhuǎn)變?yōu)樘囟ㄆ脚_(tái)的分隔符。
例子
<arg value="-l -a"/>
是一個(gè)含有空格的單個(gè)的命令行變量。
<arg line="-l -a"/>
是兩個(gè)空格分隔的命令行變量。
<arg path="/dir;/dir2:\dir3"/>
是一個(gè)命令行變量,其值在
DOS
系統(tǒng)上為
\dir;\dir2;\dir3
;在
Unix
系統(tǒng)上為
/dir:/dir2:/dir3
。
3.6 References
buildfile
元素的
id
屬性可用來引用這些元素。如果你需要一遍遍的復(fù)制相同的
XML
代碼塊,這一屬性就很有用--如多次使用
<classpath>
結(jié)構(gòu)。
下面的例子:
<project ... >
<target ... >???
<rmic ...>?????
<classpath>???????
<pathelement location="lib/"/>???????
<pathelement path="${java.class.path}/"/>???????
<pathelement path="${additional.path}"/>?????
</classpath>???
</rmic>?
</target>
<target ... >
<javac ...>
<classpath>
<pathelement location="lib/"/>
<pathelement path="${java.class.path}/"/>
<pathelement path="${additional.path}"/>
</classpath>
</javac>
</target>
</project>
可以寫成如下形式:
<project ... >
<path id="project.class.path">?
<pathelement location="lib/"/>
<pathelement path="${java.class.path}/"/>??
<pathelement path="${additional.path}"/>
</path>
<target ... >
<rmic ...>
<classpath refid="project.class.path"/>
</rmic>
</target>
<target ... >
<javac ...>
<classpath refid="project.class.path"/>
</javac>
</target>
</project>
所有使用
PatternSets, FileSets
或
path-like structures
嵌套元素的
task
也接受這種類型的引用。
================================================================
?????????????????????????????? Ant
全攻略(續(xù))---
Ant
中的內(nèi)置任務(wù)
4.1 File
(
Directory
)類
4.1.1 Mkdir
n
創(chuàng)建一個(gè)目錄,如果他的父目錄不存在,也會(huì)被同時(shí)創(chuàng)建。
n
例子:
<mkdir dir="build/classes"/>
n
說明:
如果
build
不存在,也會(huì)被同時(shí)創(chuàng)建
4.1.2 Copy
n
拷貝一個(gè)(組)文件、目錄
n
例子:
1.
拷貝單個(gè)的文件:
<copy file="myfile.txt" tofile="mycopy.txt"/>
2.
拷貝單個(gè)的文件到指定目錄下
<copy file="myfile.txt" todir="../some/other/dir"/>
3.
拷貝一個(gè)目錄到另外一個(gè)目錄下
? <copy todir="../new/dir">
??? <fileset dir="src_dir"/>
? </copy>
4.
拷貝一批文件到指定目錄下
? <copy todir="../dest/dir">
??? <fileset dir="src_dir">
????? <exclude name="**/*.java"/>
??? </fileset>
? </copy>
? <copy todir="../dest/dir">
??? <fileset dir="src_dir" excludes="**/*.java"/>
? </copy>
5.
拷貝一批文件到指定目錄下,將文件名后增加。
Bak
后綴
? <copy todir="../backup/dir">
??? <fileset dir="src_dir"/>
??? <mapper type="glob" from="*" to="*.bak"/>
? </copy>
6.
拷貝一組文件到指定目錄下,替換其中的
@
標(biāo)簽
@
內(nèi)容
? <copy todir="../backup/dir">
??? <fileset dir="src_dir"/>
??? <filterset>
????? <filter token="TITLE" value="Foo Bar"/>
??? </filterset>
? </copy>
4.1.3 Delete
n
刪除一個(gè)(組)文件或者目錄
n
例子
1.
刪除一個(gè)文件
<delete file="/lib/ant.jar"/>
2.
刪除指定目錄及其子目錄
? <delete dir="lib"/>
3.
刪除指定的一組文件
? <delete>
??? <fileset dir="." includes="**/*.bak"/>
? </delete>
4.
刪除指定目錄及其子目錄,包括他自己
? <delete includeEmptyDirs="true">
??? <fileset dir="build"/>
? </delete>
4.1.4 Move
n
移動(dòng)或重命名一個(gè)(組)文件、目錄
n
例子:
1.
移動(dòng)或重命名一個(gè)文件
<move file="file.orig" tofile="file.moved"/>
2.
移動(dòng)或重命名一個(gè)文件到另一個(gè)文件夾下面
<move file="file.orig" todir="dir/to/move/to"/>
3.
將一個(gè)目錄移到另外一個(gè)目錄下
<move todir="new/dir/to/move/to">
<fileset dir="src/dir"/>
</move>
4.
將一組文件移動(dòng)到另外的目錄下
<move todir="some/new/dir">
<fileset dir="my/src/dir">
<include name="**/*.jar"/>
<exclude name="**/ant.jar"/>
</fileset>
</move>
5.
移動(dòng)文件過程中增加。
Bak
后綴
<move todir="my/src/dir">
<fileset dir="my/src/dir">
<exclude name="**/*.bak"/>
</fileset>
<mapper type="glob" from="*" to="*.bak"/>
</move>
?
================================================================
???????????????????????????????????????????? Ant
全攻略
? --? Java
相關(guān)任務(wù)
4.2.1 Javac
n
編譯
java
原代碼
n
例子
1. <javac srcdir="${src}"
???????? destdir="${build}"
???????? classpath="xyz.jar"
???????? debug="on"
? />
編譯
${src}
目錄及其子目錄下的所有。
Java
文件,。
Class
文件將放在
$
{
build
}指定的目錄下,
classpath
表示需要用到的類文件或者目錄,
debug
設(shè)置為
on
表示輸出
debug
信息
2. <javac srcdir="${src}:${src2}"
???????? destdir="${build}"
???????? includes="mypackage/p1/**,mypackage/p2/**"
???????? excludes="mypackage/p1/testpackage/**"
???????? classpath="xyz.jar"
???????? debug="on"
? />
編譯
${src}
和
${src2}
目錄及其子目錄下的所有。
Java
文件,但是
package/p1/**,mypackage/p2/**
將被編譯,而
mypackage/p1/testpackage/**
將不會(huì)被編譯。
Class
文件將放在
$
{
build
}指定的目錄下,
classpath
表示需要用到的類文件或者目錄,
debug
設(shè)置為
on
表示輸出
debug
信息
3. <property name="classpath" value=".;./xml-apis.jar;../lib/xbean.jar;./easypo.jar"/>
<javac srcdir="${src}"
???????? destdir="${src}"
classpath="${classpath}"
debug="on"
/>
路徑是在
property
中定義的
4.2.2 java
n
執(zhí)行指定的
java
類
n
例子:
1. <java classname="test.Main">
???????? <classpath>
?????????? <pathelement location="dist/test.jar"/>
?????????? <pathelement path="${java.class.path}"/>
???????? </classpath>
?????? </java>
classname
中指定要執(zhí)行的類,
classpath
設(shè)定要使用的環(huán)境變量
2. <path id="project.class.path">
??? <pathelement location="lib/"/>
??? <pathelement path="${java.class.path}/"/>
??? <pathelement path="${additional.path}"/>
? </path>
? <target ... >
??? <rmic ...>
????? <classpath refid="project.class.path"/>
??? </rmic>
? </target>
================================================================
?????????????????????????????????????? Ant
全攻略
? --????
通過
JDBC
執(zhí)行
SQL
語句
4.5
執(zhí)行
SQL
語句
n
通過
jdbc
執(zhí)行
SQL
語句
n
例子:
1. <sql
??? driver="org.gjt.mm.mysql.Driver"
??? url="jdbc:mysql://localhost:3306/mydb"
??? userid="root"
??? password="root"
??? src="data.sql"
/>
2. <sql
??? driver="org.database.jdbcDriver"
??? url="jdbc:database-url"
??? userid="sa"
??? password="pass"
??? src="data.sql"
??? rdbms="oracle"
??? version="8.1."
??? >
</sql>
只有在
oracle
、版本是
8.1
的時(shí)候才執(zhí)行
================================================================
??????????????????????????????????????? Ant
全攻略之
?
---
?
發(fā)送郵件
4.6
發(fā)送郵件
n
使用
SMTP
服務(wù)器發(fā)送郵件
n
例子:
<mail mailhost="smtp.myisp.com" mailport="1025" subject="Test build">
? <from address="me@myisp.com"/>
? <to address="all@xyz.com"/>
? <message>The ${buildname} nightly build has completed</message>
? <fileset dir="dist">
??? <includes name="**/*.zip"/>
? </fileset>
</mail>
l mailhost
:
SMTP
服務(wù)器地址
l mailport
:
服務(wù)器端口
l subject
:
?
主題
l from
:
???
發(fā)送人地址
l to
:
?????
接受人地址
l message
:
發(fā)送的消息
l fileset
:
?
設(shè)置附件
posted on 2006-12-31 11:37 junky 閱讀(341) 評(píng)論(0) 編輯 收藏 所屬分類: ant