现在的位置: 首页 > 综合 > 正文

ANT语法2-

2013年10月06日 ⁄ 综合 ⁄ 共 10319字 ⁄ 字号 评论关闭

〈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/**, org/eclipseguide/astronomy/**"  excludes="*Test*.class "/〉〈jar destfile="dist/persistence.jar"〉  〈include name="**/*.class"/〉  〈exclude name="**/*Test*"/〉〈/jar〉

〈java〉
  任务java使用一个JVM(Java虚拟机)来调用一个类。默认情况下,所用的JVM和Ant用的是同一个。如果你是在调用一个稳定的自定义构建工具,这样可以节省时间;但如果你是在用它运行没测试过的代码,你将冒错误代码乃至构建进程崩溃的风险。你可以将fork选项设置为true来调用一个新的JVM。该任务的属性如表5.8中所列:

表5.8 〈java〉任务属性
属性 描述 是否必需
classname 要运行的类的名称 是,除非指定了jar
jar 要运行的可执行JAR文件的名称 是,除非指定了classname
classpath 要用的Classpath 否
fork 用一个新的JVM运行类或JAR 否;默认是false
failonerror 当发生错误时停止构建 否;默认是false
output 输出文件 否
append 附加或覆盖默认文件 否

  任务〈java〉可用以下嵌套元素:
· 〈classpath〉--可用于代替classpath属性
· 〈arg〉--可用于指定命令行参数
  这是一些例子:
〈java classname="HelloWorld"/〉〈java classname="Add" classpath="${basedir}/bin"〉  〈arg value="100"/〉  〈arg value="200"/〉〈/java〉

〈javac〉
  该任务编译一个或一组Java文件。它有一组复杂的选项(参看表5.9),但它比你所想象的要更容易使用,因为很多选项是提供给你以控制编译器选项的。Ant设定的选项是面向目录工作的,而非单个的Java文件,这让构建项目更容易。

表5.9 〈javac〉任务属性
属性 描述 是否必需
srcdir 源码树的根 是,除非使用了嵌套的〈src〉
destdir 输出目录 否
includes 要编译的文件的模式列表 否;默认包含所有的.java文件
excludes 用忽略的文件的模式列表 否
classpath 要用的Classpath 否
debug 包含调试信息 否;默认是false
optimize 使用优化 否;默认是false
verbose 提供详细输出 否
failonerror 发生错误时停止构建 否;默认是true

  默认情况下,〈javac〉编译时包含调试信息。这样做通常适合于将被用于产品环境的构建。你可能希望有一种方法来打开或关闭这个选项,也许会采取分开调试构建和发布构建的目标的方法。
  〈javac〉可用以下嵌套元素:
· 〈classpath〉--可用于代替classpath属性。
· 〈jar〉接受如同一个〈fileset〉元素那样的嵌套元素。(参看5.3.7节。)
  这是一些例子:
〈javac srcdir="src" destdir="bin"/〉〈javac srcdir="${basedir}" destdir="bin"  includes="org/eclipseguide/persistence/**"  excludes="**/*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添加到每个组。
· 〈packageset〉--可用于选择目录。目录路径默认为和包名称一致。
· 〈classpath〉--可用于设置classpath。
  这是一些例子:
〈javadoc destdir="doctest"  sourcefiles ="src/org/eclipseguide/persistence/ObjectManager.java"/〉〈javadoc destdir="doc"  author="true"  version="true"  use="true"  package="true"〉  〈fileset dir = "${src}/org/eclipseguide/astronomy/"〉    〈include name="**/*.java"/〉    〈exclude
name="**/*Test*"/〉  〈/fileset〉  〈classpath〉    〈pathelement path="${java.class.path}"/〉    〈pathelement location ="D:/log4j/jakarta-log4j-1.2.7/dist/lib/log4j-1.2.7.jar"/〉  〈/classpath〉〈/javadoc〉

〈mkdir〉
  该任务创建一个目录。它具有如表5.11所示的一个属性。如果指定了一个嵌套目录,那么若必要的话会连父目录也一起创建。

表5.11 〈mkdir〉任务属性
属性 描述 是否必需
dir 要创建的目录 是

  这是一个示例:
〈mkdir dir="dist/doc"〉

〈tstamp〉
  该任务设置属性DSTAMP,TSTAMP以及TODAY。一个嵌套元素,〈format〉,可用于使用Java类SimpleDateFormat定义的格式来改变它们的格式,但默认情况下,这些格式如下所示:
DSTAMP yyyyMMdd
TSTAMP hhmm
TODAY MMM dd yyyy

  关于〈tstamp〉和〈format〉元素的更多信息,请参看Ant文档。
5.3.6 属性
  属性是你可以在一个构建文件中用作符号常数的名称-值对。属性的值是通过用${和}括起名字的方式来引用的。例如,如果一个属性junit_home已经用值D:/junit/junit3.8.1定义,你可以使用该属性以在编译时添加junit的JAR文件到classpath中:
〈javac srcdir="src" destdir="bin" classpath="${junit_home}/lib/junit.jar"/〉

  属性可以用几种方式定义:
· 由Ant预定义
· 在Ant命令行,用-D选项(例如,ant -Djunit_home=D:/junit/junit3.8.1)定义
· 在一个构建文件中用〈property〉任务定义
  由Ant预定义的属性包含了所有的标准Java系统属性,包括了以下内容:
· java.class.path
· os.name
· os.version
· user.name
· user.home
  Ant特有的属性包括:
· ant.version
· ant.file
· ant.project.name

〈property〉和名字属性
  在一个Ant构建文件中设置属性的最常用方式是利用〈property〉任务及其属性name,以及属性value或location。属性value用于设置一个直接的值:
〈property name="jar_name" value="myapp.jar"/〉〈property name="company" value="Acme Industrial Software Inc."/〉

  属性location用于设置一个绝对路径或文件名。如果你设定了一个相对路径,Ant会认为它是基于basedir属性的,然后把它转换为一个绝对路径并解析它。此外,文件路径分隔符会被转换为适合于平台的字符(/,\,或者是:)。例如:
〈property name="junit_home" location= "D:/junit/junit3.8.1"/〉〈property name="src" location="src"/〉

  第一个例子不会被改动(除了文件路径分隔符外),因为它表示一个绝对路径。第二个例子会被扩展,因为它是个相对路径;假设basedir(基本路径)是c:\eclipse\workspace\persistence,${src}就等同于"c:\eclipse\workspace\persistence\src"。
〈property〉和文件属性
  你可以用file属性使用标准Java属性文件格式来从一个文件中读取属性。假设有个叫build.properties的文件放在基本目录中或是在classpath中:
# build.propertiesjunit_home= D:/junit/junit3.8.1log4j_home=D:/log4j/jakarta-log4j-1.2.7

  你可以用以下标签来读取这些属性:
〈property file="build.properties"/〉

〈property〉和环境属性
  通过用environment属性给环境设置前缀的方法,像读取属性那样去读取环境变量也是可行的。以下给环境设置了前缀myenv:
〈property environment="myenv"〉

  之后,你只要使用前缀myenv就可以像访问属性一样访问环境变量。例如,如果环境中定义了JUNIT_HOME,你可以用${myenv.JUNIT_HOME}获取它的值。
  你应该小心使用该技术,因为并不是在所有操作系统上都支持它。同时,即使底层操作系统是大小写不敏感的,在Ant中,属性名也是大小敏感的。这很容易在各版本的Windows中因疏忽而导致问题,因为系统保留了环境变量的大小写而执行比较时却不区分大小写。
  例如,如果有一个变量CLASSPATH,其值是c:\mylibs,以下既不会创建一个叫classpath的新变量,也不会改变原CLASSPATH变量的大小写:
set classpath=.%classpath%;c:\anotherlib

  相反的,这样做会更新原CLASSPATH变量的值为c:\mylibs;c\anotherlib。要确保大小写像你期望的那样,你可以先清除该变量然后重新定义它。以下几行可以放在命令行或是一个批处理文件中,它们可以强制把classpath变成小写:
set tmpvar=%classpath%set classpath=set classpath=%tmpvar%;c:\anotherlib

  如果你正要为Ant设置环境变量,像这样使用Windows批处理文件来预防问题是值得考虑的──尤其是当该批处理文件会用在其它系统上时。
5.3.7 文件集和路径结构
  由于Ant的特性,许多Ant任务,如〈javac〉和〈jar〉要求你设置路径和文件集。Ant提供了元素以使你能给它们指定足够多的细节,你既可以明确地选择文件和目录,也可以使用模式(patterns)来包含或排除一组文件或目录。因为这些元素除了引用对象以外,什么事情也不做,所以被称为类型(types)。在这里你仅使用两种类型:〈fileset〉和〈classpath〉。
〈fileset〉
  正如其名字所表述的那样,〈fileset〉元素让你选择文件集。一个〈fileset〉必需的属性只有基本目录。如果你别的什么也没有设定,该目录下的所有文件及其子目录都将被选定──特定的临时文件以及特定工具(如CVS)生成的文件除外。(这样的文件通常都有特殊的名字,用一个波纹号(~)或#开头和结尾,或者具有像CVS和SCCS这样的特定的名字和扩展名;它们和一个典型项目的一般文件相同的情况极为罕见。要获得一份Ant要默认排除的完整的模式列表,请参考Ant文档。)
  你也可以选择或排除那些和你提供的模式相匹配文件。模式可以包含以下通配符:
? 匹配一个任意字符
* 匹配零或多个字符
** 匹配零或多个目录

  考虑这两个常见的例子:你可以在include属性中用模式**/*.java来包含所有的Java源文件,也可以在exclude属性中用模式**/*Test*来排除测试用例。共同使用时,它们指定了除测试用例外的所有Java文件。
  〈fileset〉元素的属性如表5.12所列。

表5.12 〈fileset〉元素属性
属性 描述 是否必需
dir 目录树的根 是
defaultexcludes 排除通常的临时文件和工具文件 否;默认是true
includes 要包含的文件的模式列表 否
excludes 要排除的文件的模式列表 否
followsymlinks 使用符号链接所指定的文件 否

  嵌套元素〈include〉和〈exclude〉可以分别用来代替includes属性和excludes属性。
  这是一些例子:
〈fileset dir = "src/org/eclipseguide/astronomy"  includes = "**/*.java"  excludes = "**/*Test*"/〉〈fileset dir = "src/org/eclipseguide/astronomy/"〉  〈include name="**/*.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任务是很简单的事情。

抱歉!评论已关闭.