ANT不完全总结
好久没有用Ant了,最近让MyEclipse、JBuilder2008逼的重回Ant上了。手生了,写了一个脚本后,重新总结下。参考了官方的文档和网上一些资料。
一、ANT的介绍
Ant的全名是"Another Neat Tool",是由James Duncan Davidson在Make工具无法满足他的需求下所撰写出来的构建(build)工具。
Ant用Java编写,服务于Java。
二、ANT的安装配置
1、获取ANT
[url]http://ant.apache.org/[/url]
2、安装ANT
set ANT_HOME=c:/ant
set JAVA_HOME=c:/jdk-1.5.0.05
set PATH=%PATH%;%ANT_HOME%/bin
三、使用ANT
Ant的build脚本是一个XML文件,称为Buildfile,每个Buildfile包含一个project和若干个target元素,每个target又可以包含若干个task元素,每个task元素可以有一个id属性。当然id属性必须在整个文档中是唯一的。结构如下:
1、project
有三个属性,这些属性都不是必须的。比如:
属性说明如下:
name:指定项目的名字。
basedir:指定项目根路径,用于计算所有其他路径的基路径。该属性可以被basedir property覆盖。当覆盖时,该属性被忽略。如果属性和basedir property都没有设定,就使用buildfile文件的父目录。
default:指定当没有指定执行目标时,所要执行的目标。
2、target
一个target可以依赖于其他的target。例如,你可能会有一个target用于编译程序,一个target用于生成可执行文件。你在生成可执行文件之前必须先编译通过,所以生成可执行文件的target依赖于编译target。Ant会处理这种依赖关系。
Ant会依照depends属性中target出现的顺序(从左到右)依次执行每个target。然而,要记住的是只要某个target依赖于一个target,后者就会被先执行。
假定我们要执行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因该有所判断的属性。例如:
如果没有if或unless属性,target总会被执行。
可选的description属性可用来提供关于target的一行描述,这些描述可由-projecthelp命令行选项输出。
target有下面的属性,仅仅name属性是必须的。:
name: target的名字。
depends: 用逗号分隔的target的名字列表,也就是依赖表。
if 执行target所需要设定的属性名。
unless 执行target需要清除设定的属性名。
description 关于target功能的简短描述。
3、task
task不是一个Buildfile的元素,是一个泛称。
一个task是一段可执行的代码。
一个task可以有多个属性(如果你愿意的话,可以将其称之为变量)。属性只可能包含对property的引用。这些引用会在task执行前被解析。
下面是Task的一般构造形式:
这里name是task的名字,attributeN是属性名,valueN是属性值。
有一套内置的(built-in)task,以及一些可选task,但你也可以编写自己的task。
所有的task都有一个task名字属性。Ant用属性值来产生日志信息。
可以给task赋一个id属性:
这里taskname是task的名字,而taskID是这个task的唯一标识符。通过这个标识符,你可以在脚本中引用相应的task。
例如,在脚本中你可以这样:
设定某个task实例的foo属性。
在另一个task中(用java编写),你可以利用下面的语句存取相应的实例。
project.getReference("task1").
注意1:如果task1还没有运行,就不会被生效(例如:不设定属性),如果你在随后配置它,你所作的一切都会被覆盖。
注意2:未来的Ant版本可能不会兼容这里所提的属性,因为很有可能根本没有task实例,只有proxies。
4、Properties
一个project可以有很多的properties。可以在buildfile中用property task来设定,或在Ant之外设定。如果是在外部设定的,则可以通过下面的方式来引入properties配置文件。
一个property有一个名字和一个值。property可用于task的属性值。这是通过将属性名放在"${"和"}"之间并放在属性值的位置来实现的。例如如果有一个property builddir的值是"build",这个property就可用于属性值:${builddir}/classes。这个值就可被解析为build/classes。
Ant内置属性
如果你使用了
task 定义了所有的系统属性,Ant允许你使用这些属性。例如,${os.name}对应操作系统的名字。
要想得到系统属性的列表可参考the Javadoc of System.getProperties。
除了Java的系统属性,Ant还定义了一些自己的内置属性:
basedir project基目录的绝对路径 (与
的basedir属性一样)。
ant.file buildfile的绝对路径。
ant.version Ant的版本。
ant.project.name 当前执行的project的名字;由
的name属性设定.
ant.java.version Ant检测到的JVM的版本; 目前的值有"1.1", "1.2", "1.3" and "1.4".
例子
4、PATH和CLASSPATH
你可以用":"和";"作为分隔符,指定类似PATH和CLASSPATH的引用。Ant会把分隔符转换为当前系统所用的分隔符。
当需要指定类似路径的值时,可以使用嵌套元素。一般的形式是
location属性指定了相对于project基目录的一个文件和目录,而path属性接受逗号或分号分隔的一个位置列表。path属性一般用作预定义的路径--其他情况下,应该用多个location属性。
为简洁起见,classpath标签支持自己的path和location属性。所以:
可以被简写作:
也可通过元素指定路径。构成一个fileset的多个文件加入path-like structure的顺序是未定的。
上面的例子构造了一个路径值包括:${classpath}的路径,跟着lib目录下的所有jar文件,接着是classes目录。
如果你想在多个task中使用相同的path-like structure,你可以用
元素定义他们(与target同级),然后通过id属性引用--参考Referencs例子。
path-like structure可能包括对另一个path-like structurede的引用(通过嵌套
元素):
可写成:
5、命令行变量
有些task可接受参数,并将其传递给另一个进程。为了能在变量中包含空格字符,可使用嵌套的arg元素。
Attribute Description Required
value 一个命令行变量;可包含空格字符。 只能用一个
line 空格分隔的命令行变量列表。
file 作为命令行变量的文件名;会被文件的绝对名替代。
path 一个作为单个命令行变量的path-like的字符串;或作为分隔符,Ant会将其转变为特定平台的分隔符。
例子
是一个含有空格的单个的命令行变量。
是两个空格分隔的命令行变量。
是一个命令行变量,其值在DOS系统上为/dir;/dir2;/dir3;在Unix系统上为/dir:/dir2:/dir3 。
6、ID引用
buildfile元素的id属性可用来引用这些元素。如果你需要一遍遍的复制相同的XML代码块,这一属性就很有用--如多次使用结构。
下面的例子:
可以写成如下形式:
所有使用PatternSets, FileSets 或 path-like structures嵌套元素的task也接受这种类型的引用。
四、Ant内置的常用任务
Ant中内置的任务很多很多,要想记住每个任务几乎异想天开,对于开发者来说,我们仅仅需要知道一些常见的任务使用即可。对于不常用的任务,可以在使用的时候直接到 [url]http://ant.apache.org/manual/index.html[/url]里去查看使用手册。
Ant中的任务可以为3类。
核心任务。核心任务是Ant自带的任务。
可选任务。可选任务实来自第三方的任务,因此需要一个附加的JAR文件。
用户自定义的任务。用户自定义的任务实用户自己开发的任务。
下面是Ant中常用的一些任务用法的简单总结:
1、
创建一个目录,如果他的父目录不存在,也会被同时创建。它有一个属性dir用来指定所创建的目录名,其代码如下:
如果build不存在,也会被同时创建。
2、
删除文件或者目录, 如:
属性如下:
file表示要删除的文件。
dir表示要删除的目录。
includeEmptyDirs 表示指定是否要删除空目录,默认值是删除。
failonerror 表示指定当碰到错误是否停止,默认值是自动停止。
verbose 表示指定是否列出所删除的文件,默认值为不列出。
(1). 删除一个文件
(2). 删除指定目录及其子目录
(3). 删除指定的一组文件
(4). 删除指定目录及其子目录,包括他自己
3、
该标签用来生成一个jar文件,其属性如下。
destfile 表示jar文件名。
basedir 表示被归档的文件夹。
includes 表示被归档的文件模式。
exchudes 表示被排除的文件模式。
例如:
4、
该标签用于编译一个或一组java文件,其属性如下。
srcdir 表示源文件的目录。
destdir 表示class文件的输出目录。
include 表示被编译的文件的模式。
excludes 表示被排除的文件的模式。
classpath 表示所使用的类路径。
debug 表示包含的调试信息。
optimize 表示是否使用优化。
verbose 表示提供详细的输出信息。
fileonerror 表示当碰到错误就自动停止。
5、
该标签用来执行编译生成的.class文件,其属性如下。
classname 表示将执行的类名。
jar 表示包含该类的JAR文件名。
classpath 所表示用到的类路径。
fork 表示在一个新的虚拟机中运行该类。
failonerror 表示当出现错误时自动停止。
output 表示输出文件。
append 表示追加或者覆盖默认文件。
例如:
6、
该标签用于文件或文件集的拷贝,其属性如下。
file 表示源文件。
tofile 表示目标文件。
todir 表示目标目录。
overwrite 表示指定是否覆盖目标文件,默认值是不覆盖。
includeEmptyDirs 表示制定是否拷贝空目录,默认值为拷贝。
failonerror 表示指定如目标没有发现是否自动停止,默认值是停止。
verbose 表示制定是否显示详细信息,默认值不显示。
(1). 拷贝单个的文件:
(2). 拷贝单个的文件到指定目录下
(3). 拷贝一个目录到另外一个目录下
(4). 拷贝一批文件到指定目录下
(5). 拷贝一批文件到指定目录下,将文件名后增加.bak后缀
(6). 拷贝一组文件到指定目录下,替换其中指定<标签>内容
7、
移动或重命名一个(组)文件、目录
(1). 移动或重命名一个文件
(2). 移动或重命名一个文件到另一个文件夹下面
(3). 将一个目录移到另外一个目录下
(4). 将一组文件移动到另外的目录下
(5). 移动文件过程中增加.bak后缀
五、Ant的数据类型
在构建文件中为了标识文件或文件组,经常需要使用数据类型。数据类型包含在org.apache.tool.ant.types包中。下面介绍构建文件中一些常用的数据类型。
1、argument 类型