轉自:
BEA
論壇
powerise
?
1.Ant
是什么?
Ant
是一種基于
Java
和
XML
的
build
工具。
2
下載、安裝
Ant
安裝
Ant
下載
.zip
文件,解壓縮到
c:\ant1.3(
后面引用為
%ANT_HOME%)
2.1
在你運行
Ant
之前需要做一些配置工作。
·
將
bin
目錄加入
PATH
環境變量。
·
設定
ANT_HOME
環境變量,指向你安裝
Ant
的目錄。在一些
OS
上,
Ant
的腳本可以猜測
ANT_HOME
(
Unix
和
Windos NT/2000
)-但最好不要依賴這一特性。
·
可選地,設定
JAVA_HOME
環境變量(參考下面的高級小節),該變量應該指向你安裝
JDK
的目錄。
注意:不要將
Ant
的
ant.jar
文件放到
JDK/JRE
的
lib/ext
目錄下。
Ant
是個應用程序,而
lib/ext
目錄是為
JDK
擴展使用的(如
JCE
,
JSSE
擴展)。而且通過擴展裝入的類會有安全方面的限制。
2.2
運行
Ant
運行
Ant
非常簡單,當你正確地安裝
Ant
后,只要輸入
ant
就可以了。
n
沒有指定任何參數時,
Ant
會在當前目錄下查詢
build.xml
文件。如果找到了就用該文件作為
buildfile
。如果你用
-find
選項。
Ant
就會在上級目錄中尋找
buildfile
,直至到達文件系統的根。要想讓
Ant
使用其他的
buildfile
,可以用參數
-buildfile file
,這里
file
指定了你想使用的
buildfile
。
n
可以指定執行一個或多個
target
。當省略
target
時,
Ant
使用標簽
<project>
的
default
屬性所指定的
target
。
命令行選項總結:
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
使用當前目錄下的
build.xml
運行
Ant
,執行缺省的
target
。
ant -buildfile test.xml
使用當前目錄下的
test.xml
運行
Ant
,執行缺省的
target
。
ant -buildfile test.xml dist
使用當前目錄下的
test.xml
運行
Ant
,執行一個叫做
dist
的
target
。
ant -buildfile test.xml -Dbuild=build/classes dist
使用當前目錄下的
test.xml
運行
Ant
,執行一個叫做
dist
的
target
,并設定
build
屬性的值為
build/classes
。
3
編寫
build.xml
Ant
的
buildfile
是用
XML
寫的。每個
buildfile
含有一個
project
。
buildfile
中每個
task
元素可以有一個
id
屬性,可以用這個
id
值引用指定的任務。這個值必須是唯一的。(詳情請參考下面的
Task
小節)
3.1 Projects
project
有下面的屬性:
Attribute Description Required
name
項目名稱
. No
default
當沒有指定
target
時使用的缺省
target Yes
basedir
用于計算所有其他路徑的基路徑。該屬性可以被
basedir property
覆蓋。當覆蓋時,該屬性被忽略。如果屬性和
basedir property
都沒有設定,就使用
buildfile
文件的父目錄。
No
項目的描述以一個頂級的
<description>
元素的形式出現(參看
description
小節)。
一個項目可以定義一個或多個
target
。一個
target
是一系列你想要執行的。執行
Ant
時,你可以選擇執行那個
target
。當沒有給定
target
時,使用
project
的
default
屬性所確定的
target
。
3.2 Targets
一個
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,B,A"/>
假定我們要執行
target D
。從它的依賴屬性來看,你可能認為先執行
C
,然后
B
,最后
A
被執行。錯了,
C
依賴于
B
,
B
依賴于
A
,所以先執行
A
,然后
B
,然后
C
,最后
D
被執行。
一個
target
只能被執行一次,即時有多個
target
依賴于它(看上面的例子)。
如果(或如果不)某些屬性被設定,才執行某個
target
。這樣,允許根據系統的狀態(
java version, OS,
命令行屬性定義等等)來更好地控制
build
的過程。要想讓一個
target
這樣做,你就應該在
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
總會被執行。
可選的
description
屬性可用來提供關于
target
的一行描述,這些描述可由
-projecthelp
命令行選項輸出。
將你的
tstamp task
在一個所謂的初始化
target
是很好的做法,其他的
target
依賴這個初始化
target
。要確保初始化
target
是出現在其他
target
依賴表中的第一個
target
。在本手冊中大多數的初始化
target
的名字是
"init"
。
target
有下面的屬性:
Attribute Description Required
name target
的名字
Yes
depends
用逗號分隔的
target
的名字列表,也就是依賴表。
No
if
執行
target
所需要設定的屬性名。
No
unless
執行
target
需要清除設定的屬性名。
No
description
關于
target
功能的簡短描述。
No
3.3 Tasks
一個
task
是一段可執行的代碼。
一個
task
可以有多個屬性(如果你愿意的話,可以將其稱之為變量)。屬性只可能包含對
property
的引用。這些引用會在
task
執行前被解析。
下面是
Task
的一般構造形式:
<name attribute1="value1" attribute2="value2" ... />
這里
name
是
task
的名字,
attributeN
是屬性名,
valueN
是屬性值。
有一套內置的(
built-in
)
task
,以及一些可選
task
,但你也可以編寫自己的
task
。
所有的
task
都有一個
task
名字屬性。
Ant
用屬性值來產生日志信息。
可以給
task
賦一個
id
屬性:
<taskname id="taskID" ... />
這里
taskname
是
task
的名字,而
taskID
是這個
task
的唯一標識符。通過這個標識符,你可以在腳本中引用相應的
task
。例如,在腳本中你可以這樣:
<script ... >
task1.setFoo("bar");
</script>
設定某個
task
實例的
foo
屬性。在另一個
task
中(用
java
編寫),你可以利用下面的語句存取相應的實例。
project.getReference("task1").
注意
1
:如果
task1
還沒有運行,就不會被生效(例如:不設定屬性),如果你在隨后配置它,你所作的一切都會被覆蓋。
注意
2
:未來的
Ant
版本可能不會兼容這里所提的屬性,因為很有可能根本沒有
task
實例,只有
proxies
。
3.4 Properties
一個
project
可以有很多的
properties
。可以在
buildfile
中用
property task
來設定,或在
Ant
之外設定。一個
property
有一個名字和一個值。
property
可用于
task
的屬性值。這是通過將屬性名放在
"${"
和
"}"
之間并放在屬性值的位置來實現的。例如如果有一個
property builddir
的值是
"build"
,這個
property
就可用于屬性值:
${builddir}/classes
。這個值就可被解析為
build/classes
。
內置屬性
如果你使用了
<property> task
定義了所有的系統屬性,
Ant
允許你使用這些屬性。例如,
${os.name}
對應操作系統的名字。
要想得到系統屬性的列表可參考
the Javadoc of System.getProperties
。
除了
Java
的系統屬性,
Ant
還定義了一些自己的內置屬性:
basedir project
基目錄的絕對路徑
(
與
<project>
的
basedir
屬性一樣
)
。
ant.file buildfile
的絕對路徑。
ant.version Ant
的版本。
ant.project.name
當前執行的
project
的名字;由
<project>
的
name
屬性設定
.
ant.java.version Ant
檢測到的
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
會把分隔符轉換為當前系統所用的分隔符。
當需要指定類似路徑的值時,可以使用嵌套元素。一般的形式是
<classpath>
<pathelement path="${classpath}"/>
<pathelement location="lib/helper.jar"/>
</classpath>
location
屬性指定了相對于
project
基目錄的一個文件和目錄,而
path
屬性接受逗號或分號分隔的一個位置列表。
path
屬性一般用作預定義的路徑--其他情況下,應該用多個
location
屬性。
為簡潔起見,
classpath
標簽支持自己的
path
和
location
屬性。所以:
<classpath>
<pathelement path="${classpath}"/>
</classpath>
可以被簡寫作:
<classpath path="${classpath}"/>
也可通過
<fileset>
元素指定路徑。構成一個
fileset
的多個文件加入
path-like structure
的順序是未定的。
<classpath>
<pathelement path="${classpath}"/>
<fileset dir="lib">
<include name="**/*.jar"/>
</fileset>
<pathelement location="classes"/>
</classpath>
上面的例子構造了一個路徑值包括:
${classpath}
的路徑,跟著
lib
目錄下的所有
jar
文件,接著是
classes
目錄。
如果你想在多個
task
中使用相同的
path-like structure
,你可以用
<path>
元素定義他們(與
target
同級),然后通過
id
屬性引用--參考
Referencs
例子。
path-like structure
可能包括對另一個
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>
前面所提的關于
<classpath>
的簡潔寫法對于
<path>
也是有效的,如:
<path id="tests.path">
? <path refid="base.path"/>
<pathelement location="testclasses"/>
</path>
可寫成:
<path id="base.path" path="${classpath}"/>
命令行變量
有些
task
可接受參數,并將其傳遞給另一個進程。為了能在變量中包含空格字符,可使用嵌套的
arg
元素。
Attribute Description Required
value
一個命令行變量;可包含空格字符。
只能用一個
line
空格分隔的命令行變量列表。
file
作為命令行變量的文件名;會被文件的絕對名替代。
path
一個作為單個命令行變量的
path-like
的字符串;或作為分隔符,
Ant
會將其轉變為特定平臺的分隔符。
例子
<arg value="-l -a"/>
是一個含有空格的單個的命令行變量。
<arg line="-l -a"/>
是兩個空格分隔的命令行變量。
<arg path="/dir;/dir2:\dir3"/>
是一個命令行變量,其值在
DOS
系統上為
\dir;\dir2;\dir3
;在
Unix
系統上為
/dir:/dir2:/dir3
。
3.6 References
buildfile
元素的
id
屬性可用來引用這些元素。如果你需要一遍遍的復制相同的
XML
代碼塊,這一屬性就很有用--如多次使用
<classpath>
結構。
下面的例子:
<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
全攻略(續)---
Ant
中的內置任務
4.1 File
(
Directory
)類
4.1.1 Mkdir
n
創建一個目錄,如果他的父目錄不存在,也會被同時創建。
n
例子:
<mkdir dir="build/classes"/>
n
說明:
如果
build
不存在,也會被同時創建
4.1.2 Copy
n
拷貝一個(組)文件、目錄
n
例子:
1.
拷貝單個的文件:
<copy file="myfile.txt" tofile="mycopy.txt"/>
2.
拷貝單個的文件到指定目錄下
<copy file="myfile.txt" todir="../some/other/dir"/>
3.
拷貝一個目錄到另外一個目錄下
? <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.
拷貝一組文件到指定目錄下,替換其中的
@
標簽
@
內容
? <copy todir="../backup/dir">
??? <fileset dir="src_dir"/>
??? <filterset>
????? <filter token="TITLE" value="Foo Bar"/>
??? </filterset>
? </copy>
4.1.3 Delete
n
刪除一個(組)文件或者目錄
n
例子
1.
刪除一個文件
<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
移動或重命名一個(組)文件、目錄
n
例子:
1.
移動或重命名一個文件
<move file="file.orig" tofile="file.moved"/>
2.
移動或重命名一個文件到另一個文件夾下面
<move file="file.orig" todir="dir/to/move/to"/>
3.
將一個目錄移到另外一個目錄下
<move todir="new/dir/to/move/to">
<fileset dir="src/dir"/>
</move>
4.
將一組文件移動到另外的目錄下
<move todir="some/new/dir">
<fileset dir="my/src/dir">
<include name="**/*.jar"/>
<exclude name="**/ant.jar"/>
</fileset>
</move>
5.
移動文件過程中增加。
Bak
后綴
<move todir="my/src/dir">
<fileset dir="my/src/dir">
<exclude name="**/*.bak"/>
</fileset>
<mapper type="glob" from="*" to="*.bak"/>
</move>
?
================================================================
???????????????????????????????????????????? Ant
全攻略
? --? Java
相關任務
4.2.1 Javac
n
編譯
java
原代碼
n
例子
1. <javac srcdir="${src}"
???????? destdir="${build}"
???????? classpath="xyz.jar"
???????? debug="on"
? />
編譯
${src}
目錄及其子目錄下的所有。
Java
文件,。
Class
文件將放在
$
{
build
}指定的目錄下,
classpath
表示需要用到的類文件或者目錄,
debug
設置為
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/**
將不會被編譯。
Class
文件將放在
$
{
build
}指定的目錄下,
classpath
表示需要用到的類文件或者目錄,
debug
設置為
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
執行指定的
java
類
n
例子:
1. <java classname="test.Main">
???????? <classpath>
?????????? <pathelement location="dist/test.jar"/>
?????????? <pathelement path="${java.class.path}"/>
???????? </classpath>
?????? </java>
classname
中指定要執行的類,
classpath
設定要使用的環境變量
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
執行
SQL
語句
4.5
執行
SQL
語句
n
通過
jdbc
執行
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
的時候才執行
================================================================
??????????????????????????????????????? Ant
全攻略之
?
---
?
發送郵件
4.6
發送郵件
n
使用
SMTP
服務器發送郵件
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
服務器地址
l mailport
:
服務器端口
l subject
:
?
主題
l from
:
???
發送人地址
l to
:
?????
接受人地址
l message
:
發送的消息
l fileset
:
?
設置附件