〈project〉标签属性
属性 描述 是否必需
default 要运行的默认目标 是
name 项目名称 否
basedir 基本目录 否
description 项目描述 否
在basedir属性中,你既可以指定相对路径也可以指定绝对路径;不管哪种情况,这都将被解析为其他标签可以使用的绝对路径。然而使用一个相对路径会较好,因为这样能让构建更具可移植性。在进行一次构建时,其它开发者的机器以及正式构建用机不需要设置得和你的一样。以下示例将basedir属性设置为当前路径(.)--也就是说,定位到build.xml所在的目录:
〈project name="Hello" default="compile" basedir="." description = "Hello, world build file"〉
〈project〉标签可以有以下嵌套元素:
· 〈desciption〉--如果你需要将描述扩展到超过一行,你可以用嵌套元素来包含项目描述,而非用一个属性。强烈推荐写上描述。
· 〈target〉--如5.3.4节所述。
· 〈property〉--如5.3.6节所述。
5.3.4 目标
一个目标(target)就是一个任务或是一组相关任务的容器标签,可以(粗略地)比喻为一个方法(method)。它可具有如表5.2所列属性:
表5.2 〈target〉标签属性
属性 描述 是否必需
name 目标名称 是
depends 依赖关系列表 否
if 仅当设置了指定属性时执行 否
unless 仅当未设置指定属性时执行 否
description 目标描述 否
为你的主要目标给出一份描述是个好主意,因为Ant提供了一个-projecthelp选项来列出所有具有描述的目标,并把它们作为主要目标。这个选项令你的构建文档在一定程度上可以进行自我文档编制。
这里是一个例子:
〈target name="compile" depends="init" description="Compile all sources"〉
5.3.5 任务
如果把一个目标比喻为一个方法,一个任务(task)可以比喻为方法中的一条语句。Ant提供了大量的任务--超过100条,如果你把核心任务和可选任务都算上。
Ant的巨大优点之一是它对跨平台问题是透明处理的。例如,在UNIX中,一个文件路径在目录和文件间用的是向前的斜线(/),而在Windows中,用的是一个反斜线(\)。在Ant中,你都可以使用,然后Ant会提供对你正在使用的系统来说正确的格式。对于类路径来说也是一样的。在UNIX中,一个类路径中不同的路径是用一个冒号分隔的,而在Windows中使用的则是一个分号;你两个都可以用,剩下的事情就交给Ant了。
以下是一些常见的人物,它们都有一组基本属性--足以理解示例并开始编写你自己的构建文件。需要一份所有任务及其选项的完整描述的话,请参考http://ant.apache.org/manual/index.html上的Ant文档。
〈buildname〉
该任务从一个文件中读取构建号(build number),将属性build.number设置为该号码,然后将build.number的值+1后写回文件。它只有一个属性,如表5.3中所列:
表5.3 〈buildname〉任务属性
属性 描述 是否必需
file 要读取的文件(默认:build.number) 否
这里是一个例子:
〈buildnumber file="buildnum.txt" /〉
〈copy〉
该任务复制一个或一组文件。要拷贝单个的文件,用file属性即可。要拷贝多个文件,需要用一个嵌套的〈fileset〉元素。
通常,该任务仅当目标文件不存在或比源文件旧时才执行复制,但你可以通过设置override属性为true来改变默认行为。〈copy〉任务的属性如表5.4中所列:
表5.4 〈copy〉任务属性
属性 描述 是否必需
file 源文件名 是,除非使用了〈fileset〉
tofile 目标文件名 是,除非使用了todir
todir 目标目录 是,如果拷贝一个以上的文件
overwrite 覆盖更新的目标文件 否;默认是false
includeEmptyDirs 复制空目录 否;默认是true
failonerror 如果找不到文件则停止构建 否;默认是true
verbose 列出已复制的文件 否;默认是false
一个〈fileset〉嵌套元素可以用来指定一个以上的文件。(参看5.3.7节。)
这里是一个示例:
〈copy file="log4k.properties" todir="bin"/〉
〈delete〉
该任务删除一个或一组文件,或者一个目录。要删除单个的文件,用file属性即可。要删除多个文件,则要用一个嵌套的〈fileset〉元素。要删除目录,用directory属性即可。〈delete〉任务的属性如表5.5中所列:
表5.5 〈delete〉任务属性
属性 描述 是否必需
file 要删除的文件 是,除非使用了〈fileset〉或dir
dir 要删除的目录 是,除非使用了〈fileset〉或file
verbose 列出已删除的文件 否;默认是false
failonerror 如果出错则停止构建 否;默认是true
includeEmptyDirs 使用〈fileset〉时删除文件夹 否;默认是false
一个嵌套的〈fileset〉元素可以用来指定一个以上的文件。(参看5.3.7节。)
这里是两个例子:
〈delete file="ant.log"/〉〈delete dir="temp"/〉
〈echo〉
该任务将一条信息写到System.out(默认),一个文件,一份日志,或者一个侦听器。它的属性如表5.6中所列:
表5.6 〈echo〉任务属性
属性 描述 是否必需
message 要写入的文本 是,除非用了文本作为元素内容
file 输出文件 否
append 附加到文件(而非覆盖) 否;默认是false
这里有一些例子:
〈echo message="Hello"/"〉〈echo〉 This is a message from Ant.〈/echo〉
〈jar〉
该任务将一组文件压缩到一个JAR文件中。允许的选项如表5.7中所示:
表5.7 〈jar〉任务属性
属性 描述 是否必需
destfile JAR文件名 是
basedir 要打包的文件的基本目录 否
includes 要打包的文件的模式列表 否
excludes 要排除的文件的模式列表 否
模式列表是由逗号或空格分隔的文件匹配模式列表。〈jar〉接受如同〈fileset〉元素的嵌套元素。(参看5.3.7节。)
这里是一些例子:
〈jar destfile="dist/persistence.jar" basedir="bin" includes= "org/eclipseguide/persistence*.class"/〉 〈exclude name="***Test*"〉 〈classpath〉 〈pathelement path="${java.class.path}"/〉 〈pathelement location="D:/log4j/jakarta-log4j-1.2.7/dist/lib/log4j-1.2.7.jar"/〉 〈/classpath〉〈/javac〉
〈javadoc〉
任务〈javadoc〉从Java源代码文件生成一份Javadoc。任务jar、java中用于选择要包含哪些文件的选项应该比较熟悉了。指定给javadoc的首要选项设定了要包含哪些Javadoc注释;参看表5.10。
表5.10 〈javadoc〉任务属性
属性 描述 是否必需
sourcepath 源码树的根 是,除非指定了sourcefiles或者sourcepathref
sourcepathref 到一个指定源码树根的路径结构的引用 是,除非指定了sourcepath或者sourcefiles
sourcefiles 源码文件的逗号分隔列表 是,除非指定了sourcepath或者sourcepathref
destdir 目标目录 是,除非已经指定了doclet
classpath 类路径(Classpath) 否
public 仅显示公共类及成员 否
protected 显示公共和保护的类及成员 否;默认是true
package 显示包,保护和公共的类及成员 否
private 显示所有的类及成员 否
version 包含@version信息 否
use 包含@use信息 否
author 包含@author信息 否
failonerror 出错时停止构建 否;默认是true
任务〈javadoc〉可用以下嵌套元素:
· 〈fileset〉--可用于选择一组文件。Ant自动把***.java"/〉 〈exclude name="***.java来包含所有的Java源文件,也可以在exclude属性中用模式***.java" excludes = "***.java"/〉 〈exclude name="**/*Test*"/〉〈/fileset〉
〈classpath〉
〈classpath〉元素让你可以指定哪些目录和JAR文件是当类要运行时(或者,对于Java编译器来说,要编译时),程序应该搜索的。默认情况下,Ant继承了环境的类路径,但你都需要为特定程序(如JUnit)添加额外的目录或JAR文件。使用类路径的任务提供了一个classpath属性,但有时使用一个〈classpath〉嵌套元素会更方便些──尤其是当类路径很长的时候。路径可以包含用一个冒号或一个分号隔开的多个文件或目录;Ant会将分隔符转换为适合于当前操作系统的字符。
表5.13中列出了〈classpath〉元素的属性。
表5.13 〈classpath〉元素属性
属性 描述 是否必需
path 冒号或分号分隔的路径 否
location 单个文件或目录 否
一个或多个〈pathelement〉元素可以通过嵌套来构造一个更长的类路径。〈pathelement〉接受和〈classpath〉:path以及location相同的属性。
此外,一个〈fileset〉可以用于指定文件。
这是一些例子:
〈classpath path = "bin"/〉〈classpath〉 〈pathelement path="${java.class.path}"/〉 〈pathelement location="${junit_path}"/〉 〈pathelement location="${log4j_path}"/〉〈/classpath〉
5.3.8 Ant的额外能力
这里讲述的基本知识已经足以让你开始用Ant来工作而不会不知所措了。当你用Ant做更多的事情之后,你很可能会遇到一种情况──也许会发觉你一直在反复使用相同的〈filelist〉──并想知道有没有一种比剪切、粘贴更优雅的解决方案。通常,你会发现在Ant中,几乎没有什么是不可能的。
减少冗余代码的一种方法是使用引用。例如,Ant中的每个元素都能指定一个ID;并且(取决于涉及的元素的类型)你可以在构建文件中的其它地方使用ID来引用那个元素。例如,你可以使用id属性给一个〈classpath〉指定一个标识符:
〈classpath id="common_path"〉 〈pathelement path="${java.class.path}"/〉 〈pathelement location="${junit_path}"/〉 〈pathelement location="${log4j_path}"/〉〈/classpath〉
这样一来,这个类路径就可以在别的地方用refid属性来引用:
〈javac srcdir="src" destdir="bin"〉 〈classpath refid=common_path/〉〈/javac〉
Ant提供了任务和类型以供你过滤文件,如同以文本来复制、替换符号一样,这样你就能够在你的构建中包含版本信息──例如,使用带有一个〈filterset〉的〈copy〉任务。它让你可以通过使用选择器类型(如〈contains〉,〈date〉和〈size〉)来按照复杂的条件选择文件。在很罕见的情况下,Ant没有可以符合你需求的任务,你会发现编写自己的Ant任务是很简单的事情。