转自:
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
:
设置附件