一、概述
Property用于在project中设置属性,属性名区分大小写。属性值一旦设置完就不可再改变。属性是定制构建过程的一种重要方式,或者为在构建文件中重复使用的字符串提供快捷方式。通过在“${”和“}”之间放置属性值来支持在task的属性或者嵌套文本中使用,例如:有一个属性srcdir的值是/tmp,那么${srcdir}/classes在运行时会被解析为/tmp/classes。
二、设置方法
有7种方式设置属性:
- 通过name和value或location属性。
- 通过name和嵌套文本。
- 通过name和refid属性。
- 通过将file属性设置为要加载的属性文件的文件名。文件格式为java.util.Properties中定义的格式,对于非ISO8859-1的转义也是如此。
- 通过将url属性设置为加载属性的url。该url必须指向一个具有由类java.util.Properties中所定义的格式的文件。
- 通过将resource属性设置为要加载的属性文件的文件名。该文件在当前的classpath或者指定的classpath中。
- 通过environment 属性设置环境变量的前缀。可通过前缀.变量名的方式访问一个环境变量。
属性值的一部分可能包含对其他属性的引用,这些引用在属性被设置时解析,从文件中加载的属性也是如此。
从Ant1.8.0开始可以从遵从SUN DTD的xml中加载属性,前提是jdk1.5以上并且文件名以.xml结尾。
三、简单示例
通过value将属性message设置为“hello ant!”。
<property name="message" value="hello ant!"/>
通过嵌套文本将属性message设置为“hello ant!”。
<property name="message" >hello ant!</property>
通过refid设置other属性为“hello ant!”。
<property name="message" value="hello ant!" id="msg"/>
<property name="other" refid="msg"/>
通过file从test.properties中读取属性
<property file="test.properties" />
通过url从属性文件中读取属性
<property url="http://127.0.0.1:8080/path/to/file/test.properties" />
通过resource从classpath中的test.properties中读取属性
<property resource="test.properties" />
通过environment属性获取系统属性
<property environment="env"/>
<echo message="Number of Processors = ${env.NUMBER_OF_PROCESSORS}"/>
<echo message="ANT_HOME is set to = ${env.ANT_HOME}"/>
假设project的绝对路径为C:\Users\runner
通过location设置属性dir的值,relative为 true表示使用相对路径,相对路径以project的basedir为基础与property的basedir进行计算。dir值为相对于计算后的路径test.properties文件的位置,如下dir值为:runner\test\test.properties。property的basedir默认值为“.”,即当前目录。project的basedir默认值为构建文件所在的目录。
<property name="dir" location="test\test.properties" relative="true" basedir=".."/>
而如下dir值为..\test\test.properties
<property name="dir" location="test\test.properties" relative="true" basedir="pro"/>
relative默认值为false,当为false时basedir属性是无效的,只会返回绝对路径。如下dir值为C:\Users\runner\test\test.properties
<property name="dir" location="test\test.properties" />
四、内置属性
Ant提供了对所有系统属性的访问就像它们已经用property定义了一样。例如${user.name}就是用户的账户名称。具体支持的系统属性可以查看java.lang.System的getProperties方法。
此外还有一些内置属性
basedir:project的基础目录的绝对路径,也就是project元素的basedir属性,默认值为当前构建文件的目录。
此外还有一些内置属性
basedir:project的基础目录的绝对路径,也就是project元素的basedir属性,默认值为当前构建文件的目录。
ant.file:构建文件的绝对路径。
ant.version:ant版本号。
ant.project.name:project名称,即project的name属性值。
ant.project.name:project名称,即project的name属性值。
ant.project.default-target:当前project执行时的默认target名称,即project的default属性。
ant.project.invoked-targets:在命令行中执行当前project时,命令行中指定的逗号分隔的target列表。
ant.java.version:ant检测到的jdk版本。
ant.core.lib:ant.jar所在目录的绝对路径。
ant.home:ant的主目录。
ant.library.dir:加载ant的jar的路径。
五、Property扩展
$$
当Ant遇到
${key}结构时,精确的语义分析取决配置的PropertyHelper委托类。在默认设定下,Ant会将
$$解析为
$,并且会立即停止文本的常规属性扩展机制。例如,
$${key}扩展为
${key}没有value,即使已经定义了一个名字为key值为value的属性。相当于转义字符
$。
例如,如果属性builddir的值为build/classes:
<echo>$${builddir}=${builddir}</echo>
将会输出${builddir}=build/classes
除了一个类似于属性的构造之外,一个单独的
$字符(包括大括号)将按字面意思解析。指定这个字符的正确方式是无条件的使用转义机制。所以通过4个
$可以得到2个
$。但是
$$和
$不要混用,
$$$也会解析为
$$。简单写说,如果想要解析出
${}结构的值,
$应该为奇数个,否则为偶数个。
嵌套括号
在默认设定下,Ant不能解析嵌套的括号。在创建属性名时,只会到第一个遇到的右括号。例如,${a${b}},将会解析为两部分:a${b和第二个}。也就是说不能很容易的扩展属性名,但是有一些
变通的方法。
扩展属性名
通过 ${toString:}获得引用的值。例如,获取fileset的文件列表。文件名按“;”分隔。
<fileset id="sourcefiles" dir="." includes="*.xml" />
<echo> sourcefiles = ${toString:sourcefiles} </echo>
通过 ${ant.refid:}获得引用的值。例如,获取url的url属性值。
<url url="http://ant.apache.org/" id="anturl"/>
<echo>${ant.refid:anturl}</echo>