Ant 构建文件是用 XML 编写的,它不能像你喜欢的编程语言那样去声明变量。然而,正如你可能已经想到的,如果允许 Ant 声明变量,如项目名称,项目源目录等,这将是非常有用的。
Ant 使用属性 (property) 元素来让你能够具体说明属性。这就允许这些属性能够在不同的构建和不同的环境下发生改变。
默认情况下,Ant 提供以下预定义的属性,这些属性都是可以在构建文件中使用的:
属性 | 解释 |
---|---|
ant.file | 该构建文件的完整地址 |
ant.version | 安装的 Apache Ant 的版本 |
basedir | 构建文件的基目录的绝对路径,作为 **project** 元素的 **basedir** 属性 |
ant.java.version | Ant 使用的 JAVA 语言的软件开发工具包的版本 |
ant.project.name | 项目的名字,具体声明为 **project** 元素的 **name** 属性 |
ant.project.default-target | 当前项目的默认目标 |
ant.project.invoked-targets | 在当前项目中被调用的目标的逗号分隔列表 |
ant.core.lib | Ant 的 jar 文件的完整的地址 |
ant.home | Ant 安装的主目录 |
ant.library.dir | Ant 库文件的主目录,特别是 ANT_HOME/lib 文件夹 |
Ant 也确保系统属性在构建文件中可用,如 file.separator。
除了上述内容以外,用户也可以使用 property 元素定义一些额外的属性。下面的例子就演示了怎样去定义一个叫做 sitename 的属性:
xml version="1.0"?>
<project name="Hello World Project" default="info">
<property name="sitename" value="www.tutorialspoint.com"/>
<target name="info">
<echo>Apache Ant version is ${ant.version} - You are at ${sitename} echo>
target>
project>
在上述的构建文件下运行 Ant 可以产生以下输出:
C:\>ant
Buildfile: C:\build.xml
info: [echo] Apache Ant version is Apache Ant(TM) version 1.8.2
compiled on December 20 2010 - You are at www.tutorialspoint.com
BUILD SUCCESSFUL
Total time: 0 seconds
C:\>
<project name="Hello World Project" default="info">
<property name="sitename" value="www.tutorialspoint.com"/>
<target name="info" description="这是info的描述信息">
<echo>Apache Ant version is ${ant.version} - You are at ${sitename}echo>
<echo>Ant 使用的 JAVA 语言的软件开发工具包的版本:${ant.java.version}echo>
target>
project>
输出:
PS E:\web> ant
Buildfile: build.xml
info:
[echo] Apache Ant version is Apache Ant version 1.6.5 compiled on June 2 2005 - You are at www.tutorialspoint.com
[echo] Ant 使用的 JAVA 语言的软件开发工具包的版本:1.5
BUILD SUCCESSFUL
Total time: 0 seconds
当你只需要对小部分属性进行设置时,可以选择直接在构建文件中设置。然而,对于大项目,最好将设置属性的信息存储在一个独立的文件中。
存储属性信息在一个独立的文件中将会提供以下好处:
这里没有硬性规定,但是一般情况下,属性文件都被命名为 build.properties, 并且与 build.xml 存放在同一目录层。 你可以基于部署环境 ——比如: build.properties.dev 和 build.properties.test 创建多个 build.properties 文件。
在下面的例子中展示了 build.xml 文件和与之相联系的 build.properties文件:
xml version="1.0"?>
<project name="Hello World Project" default="info">
<property file="build.properties"/>
<target name="info">
<echo>Apache Ant version is ${ant.version} - You are at ${sitename} echo>
target>
project>
# The Site Name
sitename=wiki.w3cschool.cn
buildversion=3.3.2
注意到上面的练习中,sitename 是一个自定义属性,执行后映射到一个地址为 “wiki.w3cschool.cn” 的网站上。你可以用这种方式声明任意数量的属性。在上面的例子中,还有一个自定义属性 buildversioin,它表明了当前构建的版本号。
除了以上提到的两个属性, Ant 还提供了其他内置属性,在前一章节中已经提到,但是下面我们再一次给出相关属性。
属性 | 描述 |
ant.file | 表示 buildfile 的绝对路径。 |
ant.version | 表示 Ant 的版本。 |
basedir | 表示 project 基目录的绝对路径。 |
ant.jave.version | 表示 Ant 检测到的 JDK 的版本。 |
ant.project.name | 表示当前指定的 project 的名字。 |
ant.project.default-target | 表示当前项目的默认目标。 |
ant.project.invoked-targets | 表示被当前项目调用的一系列用逗号分隔开的目标。 |
ant.core.lib | 表示 Ant jar 文件的绝对路径。 |
ant.home | 表示 Ant 安装的根目录。 |
ant.library.dir | 表示 Ant 函数库,一般情况下为 ANT_HOME/lib 文件的根目录。 |
在这一章节的例子中,我们用到的 Ant 内置属性是 ant.version 属性。
build.xml:
<project name="Hello World Project" default="info">
<property file="build.properties"/>
<target name="info">
<echo>Apache Ant version is ${ant.version} - You are at ${sitename} echo>
<echo>使用的JAVA语言的软件开发工具包的版本: ${ant.java.version} echo>
<echo>project 基目录的绝对路径: ${basedir} echo>
<echo>当前指定的 project 的名字: ${ant.project.name} echo>
target>
project>
build.properties:
# The Site Name
sitename=wiki.w3cschool.cn
# 这样好像改不了
ant.java.version=1.6
# 这个这里可以改,但build.xml里面配置的优先
ant.project.name=Hello
输出:
PS E:\web> ant
Buildfile: build.xml
info:
[echo] Apache Ant version is Apache Ant version 1.6.5 compiled on June 2 2005 - You are at wiki.w3cschool.cn
[echo] 使用的JAVA语言的软件开发工具包的版本: 1.5
[echo] project 基目录的绝对路径: E:\web
[echo] 当前指定的 project 的名字: Hello World Project
BUILD SUCCESSFUL
Total time: 0 seconds
Ant 提供一些预定义的数据类型。不要将术语“数据类型”和那些在编程语言中可用的数据类型相混淆,而是将他们视作一组已经在产品中配置好的服务。
下述的数据类型是由 Apache Ant 提供的。
文件集的数据类型代表了一个文件集合。它被当作一个过滤器,用来包括或移除匹配某种模式的文件。
例如,参考下面的代码。这里,src 属性指向项目的源文件夹。
文件集选择源文件夹中所有的 .java 文件,除了那些包含有 ‘Stub’ 单词的文件。能区分大小写的过滤器被应用到文件集上,这意味着名为 Samplestub.java 的文件将不会被排除在文件集之外。
<fileset dir="${src}" casesensitive="yes">
<include name="**/*.java"/>
<exclude name="**/*Stub*"/>
fileset>
模式集合
一个模式集合指的是一种模式,基于这种模式,能够很容易地过滤文件或者文件夹。模式可以使用下述的元字符进行创建。
? -仅匹配一个字符
*-匹配零个或者多个字符
**-递归地匹配零个或者多个目录
最长匹配原则(has more characters)
说明,URL请求/app/dir/file.jsp,现在存在两个路径匹配模式/**/.jsp和/app/dir/.jsp,那么会根据模式/app/dir/*.jsp来匹配
<patternset id="java.files.without.stubs">
<include name="src/**/.java"/>
<exclude name="src/**/*Stub*"/>
patternset>
该模式集合能够通过一个类似于下述的文件集进行重用:
<fileset dir="${src}" casesensitive="yes">
<patternset refid="java.files.without.stubs"/>
fileset>
文件列表数据类型与文件集相类似,除了以下几处不同:
让我们来看一个下述的关于文件列表数据类型的例子。在这个例子中,属性 webapp.src.folder 指向该项目中的 Web 应用的源文件夹。
<filelist id="config.files" dir="${webapp.src.folder}">
<file name="applicationConfig.xml"/>
<file name="faces-config.xml"/>
<file name="web.xml"/>
<file name="portlet.xml"/>
filelist>
使用一个过滤器集合数据类型与拷贝任务,你可以在所有文件中使用一个替换值来替换掉一些与模式相匹配的文本。
一个常见的例子就是对一个已经发行的说明文件追加版本号,代码如下:
<copy todir="${output.dir}">
<fileset dir="${releasenotes.dir}" includes="/.txt"/>
<filterset>
<filter token="VERSION" value="${current.version}"/>
filterset>
copy>
在这段代码中:
path 数据类型通常被用来表示一个类路径。各个路径之间用分号或者冒号隔开。然而,这些字符在运行时被替代为执行系统的路径分隔符。
类路径被设置为项目中 jar 文件和类文件的列表,如下面例子所示:
<path id="build.classpath.jar">
<pathelement path="${env.J2EE_HOME}/${j2ee.jar}"/>
<fileset dir="lib">
<include name="/*.jar"/>
fileset>
path>
在这段代码中: