5.3.3 项目 一个构建文件必须具备的文档元素是标签,它必须指定一个默认目标,还可以指定一个名字(可选的)。此外,还可以标明项目的基本目录。表5.1中列出了它的属性: 表5.1 标签属性 属性 描述 是否必需 default 要运行的默认目标 是 name 项目名称 否 basedir 基本目录 否 description 项目描述 否 在basedir属性中,你既可以指定相对路径也可以指定绝对路径;不管哪种情况,这都将被解析为其他标签可以使用的绝对路径。然而使用一个相对路径会较好,因为这样能让构建更具可移植性。在进行一次构建时,其它开发者的机器以及正式构建用机不需要设置得和你的一样。以下示例将basedir属性设置为当前路径(.)--也就是说,定位到build.xml所在的目录: 标签可以有以下嵌套元素: --如果你需要将描述扩展到超过一行,你可以用嵌套元素来包含项目描述,而非用一个属性。强烈推荐写上描述。 --如5.3.4节所述。 --如5.3.6节所述。 5.3.4 目标 一个目标(target)就是一个任务或是一组相关任务的容器标签,可以(粗略地)比喻为一个方法(method)。它可具有如表5.2所列属性: 表5.2 标签属性 属性 描述 是否必需 name 目标名称 是 depends 依赖关系列表 否 if 仅当设置了指定属性时执行 否 unless 仅当未设置指定属性时执行 否 description 目标描述 否 为你的主要目标给出一份描述是个好主意,因为Ant提供了一个-projecthelp选项来列出所有具有描述的目标,并把它们作为主要目标。这个选项令你的构建文档在一定程度上可以进行自我文档编制。 这里是一个例子: 5.3.5 任务 如果把一个目标比喻为一个方法,一个任务(task)可以比喻为方法中的一条语句。Ant提供了大量的任务--超过100条,如果你把核心任务和可选任务都算上。 Ant的巨大优点之一是它对跨平台问题是透明处理的。例如,在UNIX中,一个文件路径在目录和文件间用的是向前的斜线(/),而在Windows中,用的是一个反斜线(\)。在Ant中,你都可以使用,然后Ant会提供对你正在使用的系统来说正确的格式。对于类路径来说也是一样的。在UNIX中,一个类路径中不同的路径是用一个冒号分隔的,而在Windows中使用的则是一个分号;你两个都可以用,剩下的事情就交给Ant了。 以下是一些常见的人物,它们都有一组基本属性--足以理解示例并开始编写你自己的构建文件。需要一份所有任务及其选项的完整描述的话,请参考http://ant.apache.org/manual/index.html上的Ant文档。 该任务从一个文件中读取构建号(build number),将属性build.number设置为该号码,然后将build.number的值+1后写回文件。它只有一个属性,如表5.3中所列: 表5.3 任务属性 属性 描述 是否必需 file 要读取的文件(默认:build.number) 否 这里是一个例子: 该任务复制一个或一组文件。要拷贝单个的文件,用file属性即可。要拷贝多个文件,需要用一个嵌套的元素。 通常,该任务仅当目标文件不存在或比源文件旧时才执行复制,但你可以通过设置override属性为true来改变默认行为。任务的属性如表5.4中所列: 表5.4 任务属性 属性 描述 是否必需 file 源文件名 是,除非使用了 tofile 目标文件名 是,除非使用了todir todir 目标目录 是,如果拷贝一个以上的文件 overwrite 覆盖更新的目标文件 否;默认是false includeEmptyDirs 复制空目录 否;默认是true failonerror 如果找不到文件则停止构建 否;默认是true verbose 列出已复制的文件 否;默认是false 一个嵌套元素可以用来指定一个以上的文件。(参看5.3.7节。) 这里是一个示例: 该任务删除一个或一组文件,或者一个目录。要删除单个的文件,用file属性即可。要删除多个文件,则要用一个嵌套的元素。要删除目录,用directory属性即可。任务的属性如表5.5中所列: 表5.5 任务属性 属性 描述 是否必需 file 要删除的文件 是,除非使用了或dir dir 要删除的目录 是,除非使用了或file verbose 列出已删除的文件 否;默认是false failonerror 如果出错则停止构建 否;默认是true includeEmptyDirs 使用时删除文件夹 否;默认是false 一个嵌套的元素可以用来指定一个以上的文件。(参看5.3.7节。) 这里是两个例子: 该任务将一条信息写到System.out(默认),一个文件,一份日志,或者一个侦听器。它的属性如表5.6中所列: 表5.6 任务属性 属性 描述 是否必需 message 要写入的文本 是,除非用了文本作为元素内容 file 输出文件 否 append 附加到文件(而非覆盖) 否;默认是false 这里有一些例子: This is a message from Ant. 该任务将一组文件压缩到一个JAR文件中。允许的选项如表5.7中所示: 表5.7 任务属性 属性 描述 是否必需 destfile JAR文件名 是 basedir 要打包的文件的基本目录 否 includes 要打包的文件的模式列表 否 excludes 要排除的文件的模式列表 否 模式列表是由逗号或空格分隔的文件匹配模式列表。接受如同元素的嵌套元素。(参看5.3.7节。) 这里是一些例子: basedir="bin" includes= "org/eclipseguide/persistence/**, org/eclipseguide/astronomy/**" excludes="*Test*.class "/> 任务java使用一个JVM(Java虚拟机)来调用一个类。默认情况下,所用的JVM和Ant用的是同一个。如果你是在调用一个稳定的自定义构建工具,这样可以节省时间;但如果你是在用它运行没测试过的代码,你将冒错误代码乃至构建进程崩溃的风险。你可以将fork选项设置为true来调用一个新的JVM。该任务的属性如表5.8中所列: 表5.8 任务属性 属性 描述 是否必需 classname 要运行的类的名称 是,除非指定了jar jar 要运行的可执行JAR文件的名称 是,除非指定了classname classpath 要用的Classpath 否 fork 用一个新的JVM运行类或JAR 否;默认是false failonerror 当发生错误时停止构建 否;默认是false output 输出文件 否 append 附加或覆盖默认文件 否 任务可用以下嵌套元素: --可用于代替classpath属性 --可用于指定命令行参数 这是一些例子: 该任务编译一个或一组Java文件。它有一组复杂的选项(参看表5.9),但它比你所想象的要更容易使用,因为很多选项是提供给你以控制编译器选项的。Ant设定的选项是面向目录工作的,而非单个的Java文件,这让构建项目更容易。 表5.9 任务属性 属性 描述 是否必需 srcdir 源码树的根 是,除非使用了嵌套的 destdir 输出目录 否 includes 要编译的文件的模式列表 否;默认包含所有的.java文件 excludes 用忽略的文件的模式列表 否 classpath 要用的Classpath 否 debug 包含调试信息 否;默认是false optimize 使用优化 否;默认是false verbose 提供详细输出 否 failonerror 发生错误时停止构建 否;默认是true 默认情况下,编译时包含调试信息。这样做通常适合于将被用于产品环境的构建。你可能希望有一种方法来打开或关闭这个选项,也许会采取分开调试构建和发布构建的目标的方法。 可用以下嵌套元素: --可用于代替classpath属性。 接受如同一个元素那样的嵌套元素。(参看5.3.7节。) 这是一些例子: includes="org/eclipseguide/persistence/**" excludes="**/*Test*"> 任务从Java源代码文件生成一份Javadoc。任务jar、java中用于选择要包含哪些文件的选项应该比较熟悉了。指定给javadoc的首要选项设定了要包含哪些Javadoc注释;参看表5.10。 表5.10 任务属性 属性 描述 是否必需 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 任务可用以下嵌套元素: --可用于选择一组文件。Ant自动把**/*.java添加到每个组。 --可用于选择目录。目录路径默认为和包名称一致。 --可用于设置classpath。 这是一些例子: sourcefiles ="src/org/eclipseguide/persistence/ObjectManager.java"/> author="true" version="true" use="true" package="true"> 该任务创建一个目录。它具有如表5.11所示的一个属性。如果指定了一个嵌套目录,那么若必要的话会连父目录也一起创建。 表5.11 任务属性 属性 描述 是否必需 dir 要创建的目录 是 这是一个示例: 该任务设置属性DSTAMP,TSTAMP以及TODAY。一个嵌套元素,,可用于使用Java类SimpleDateFormat定义的格式来改变它们的格式,但默认情况下,这些格式如下所示: DSTAMP yyyyMMdd TSTAMP hhmm TODAY MMM dd yyyy 关于和元素的更多信息,请参看Ant文档。 5.3.6 属性 属性是你可以在一个构建文件中用作符号常数的名称-值对。属性的值是通过用${和}括起名字的方式来引用的。例如,如果一个属性junit_home已经用值D:/junit/junit3.8.1定义,你可以使用该属性以在编译时添加junit的JAR文件到classpath中: 属性可以用几种方式定义: 由Ant预定义 在Ant命令行,用-D选项(例如,ant -Djunit_home=D:/junit/junit3.8.1)定义 在一个构建文件中用任务定义 由Ant预定义的属性包含了所有的标准Java系统属性,包括了以下内容: java.class.path os.name os.version user.name user.home Ant特有的属性包括: ant.version ant.file ant.project.name 和名字属性 在一个Ant构建文件中设置属性的最常用方式是利用任务及其属性name,以及属性value或location。属性value用于设置一个直接的值: 属性location用于设置一个绝对路径或文件名。如果你设定了一个相对路径,Ant会认为它是基于basedir属性的,然后把它转换为一个绝对路径并解析它。此外,文件路径分隔符会被转换为适合于平台的字符(/,\,或者是:)。例如: 第一个例子不会被改动(除了文件路径分隔符外),因为它表示一个绝对路径。第二个例子会被扩展,因为它是个相对路径;假设basedir(基本路径)是c:\eclipse\workspace\persistence,${src}就等同于"c:\eclipse\workspace\persistence\src"。 和文件属性 你可以用file属性使用标准Java属性文件格式来从一个文件中读取属性。假设有个叫build.properties的文件放在基本目录中或是在classpath中: # build.properties junit_home= D:/junit/junit3.8.1 log4j_home=D:/log4j/jakarta-log4j-1.2.7 你可以用以下标签来读取这些属性: 和环境属性 通过用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任务,如和要求你设置路径和文件集。Ant提供了元素以使你能给它们指定足够多的细节,你既可以明确地选择文件和目录,也可以使用模式(patterns)来包含或排除一组文件或目录。因为这些元素除了引用对象以外,什么事情也不做,所以被称为类型(types)。在这里你仅使用两种类型:和。 正如其名字所表述的那样,元素让你选择文件集。一个必需的属性只有基本目录。如果你别的什么也没有设定,该目录下的所有文件及其子目录都将被选定──特定的临时文件以及特定工具(如CVS)生成的文件除外。(这样的文件通常都有特殊的名字,用一个波纹号(~)或#开头和结尾,或者具有像CVS和SCCS这样的特定的名字和扩展名;它们和一个典型项目的一般文件相同的情况极为罕见。要获得一份Ant要默认排除的完整的模式列表,请参考Ant文档。) 你也可以选择或排除那些和你提供的模式相匹配文件。模式可以包含以下通配符: ? 匹配一个任意字符 * 匹配零或多个字符 ** 匹配零或多个目录 考虑这两个常见的例子:你可以在include属性中用模式**/*.java来包含所有的Java源文件,也可以在exclude属性中用模式**/*Test*来排除测试用例。共同使用时,它们指定了除测试用例外的所有Java文件。 元素的属性如表5.12所列。 表5.12 元素属性 属性 描述 是否必需 dir 目录树的根 是 defaultexcludes 排除通常的临时文件和工具文件 否;默认是true includes 要包含的文件的模式列表 否 excludes 要排除的文件的模式列表 否 followsymlinks 使用符号链接所指定的文件 否 嵌套元素和可以分别用来代替includes属性和excludes属性。 这是一些例子: includes = "**/*.java" excludes = "**/*Test*"/> 元素让你可以指定哪些目录和JAR文件是当类要运行时(或者,对于Java编译器来说,要编译时),程序应该搜索的。默认情况下,Ant继承了环境的类路径,但你都需要为特定程序(如JUnit)添加额外的目录或JAR文件。使用类路径的任务提供了一个classpath属性,但有时使用一个嵌套元素会更方便些──尤其是当类路径很长的时候。路径可以包含用一个冒号或一个分号隔开的多个文件或目录;Ant会将分隔符转换为适合于当前操作系统的字符。 表5.13中列出了元素的属性。 表5.13 元素属性 属性 描述 是否必需 path 冒号或分号分隔的路径 否 location 单个文件或目录 否 一个或多个元素可以通过嵌套来构造一个更长的类路径。接受和:path以及location相同的属性。 此外,一个可以用于指定文件。 这是一些例子: 5.3.8 Ant的额外能力 这里讲述的基本知识已经足以让你开始用Ant来工作而不会不知所措了。当你用Ant做更多的事情之后,你很可能会遇到一种情况──也许会发觉你一直在反复使用相同的──并想知道有没有一种比剪切、粘贴更优雅的解决方案。通常,你会发现在Ant中,几乎没有什么是不可能的。 减少冗余代码的一种方法是使用引用。例如,Ant中的每个元素都能指定一个ID;并且(取决于涉及的元素的类型)你可以在构建文件中的其它地方使用ID来引用那个元素。例如,你可以使用id属性给一个指定一个标识符: 这样一来,这个类路径就可以在别的地方用refid属性来引用: Ant提供了任务和类型以供你过滤文件,如同以文本来复制、替换符号一样,这样你就能够在你的构建中包含版本信息──例如,使用带有一个的任务。它让你可以通过使用选择器类型(如,和)来按照复杂的条件选择文件。在很罕见的情况下,Ant没有可以符合你需求的任务,你会发现编写自己的Ant任务是很简单的事情。
ant属性详解
最新推荐文章于 2023-11-02 16:11:36 发布