天天看点

ANT语法2-

〈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任务是很简单的事情。