每隔一段时间,我会想起Ant属性的一些细微差别 ,一旦忘记它们,在与Ant交互时会引起混乱。 特别是, Ant属性 通常是不可变的 (不包括Ant 1.8版本的 局部属性 ),并且在其首次设置时“永久”设置,这一事实可能会导致令人惊讶的结果。
《 蚂蚁手册 》的属性部分指出:“通常无法更改属性值,一旦设置了属性,大多数任务将不允许修改其值。” 该手册中有关“ 属性”任务的部分补充说:“属性是不可变的:谁先设置属性,谁会先冻结该属性,然后再进行其余构建; 它们绝对不是变量。”
属性定义的顺序会影响其设置。 通常,一旦设置了属性,以后就无法在同一构建文件或被调用的构建文件中重新定义,则无法更改其值。 此外,还有一组已经定义的属性,这些属性通常无法在Ant构建文件中重新定义。 这些包括Java System属性和内置的Ant属性 。
尽管在Ant构建文件中定义的属性不能覆盖默认的Ant内置属性或Java系统属性的值,但是通常可以使用Ant启动器上的-D
选项设置这些属性名称的这些值。 但是,即使使用-D
选项,也无法重置其中的少数。 例如,即使通过-D
选项作为参数传递,也无法从Ant构建文件的路径和名称更改ant.file
。 当然,这可能也是一样,因为似乎没有充分的理由假装Ant构建文件不是实际的文件。
为了演示上述Ant属性解析的“规则”,可以使用以下简单的Ant构建文件。
build.xml在Ant中显示属性
<project name="Project" default="showProperties" basedir="."><property environment="env"/><target name="showProperties"><!-- Java System Properties --><echo message="java.home: ${java.home}" /><echo message="user.home: ${user.home}" /><!-- Custom Properties --><echo message="name.last: ${name.last}" /><echo message="name.first: ${name.first}" /><!-- Ant Built-in Properties --><echo message="ant.file: ${ant.file}" /><echo message="ant.version: ${ant.version}" /><echo message="ant.java.version: ${ant.java.version}" /></target></project>
在此示例中,有几个Java系统属性,几个自定义属性和一些Ant内置属性。 这些使我可以轻松地演示如何覆盖或不覆盖属性。 下一个屏幕快照显示了属性的“默认”设置,而不会被覆盖。 根本没有定义两个自定义变量,但是其他两个(Java系统和Ant内置属性)具有为Ant构建自动设置的值。
下一个屏幕快照显示了尝试通过-D
参数传递为构建中使用的属性提供值的尝试。 如示例所示,即使系统属性和Ant内置属性也可以使用-D
属性设置覆盖,但ant.file
属性不会被覆盖。
指定Ant文件中使用的属性的一种常用方法是使用Property任务在Ant构建文件中指定它们。 下一个代码清单将内部定义的属性添加到上面显示的文件中。
build.xml在内部定义属性
<project name="Project" default="showProperties" basedir="."><property environment="env"/><property name="user.home" value="/bin" /><property name="java.home" value="java" /><property name="name.last" value="Flintstone" /><property name="name.first" value="Fred" /><property name="ant.file" value="text.txt" /><property name="ant.version" value="1.8." /><property name="ant.java.version" value="6" /><target name="showProperties"><!-- Java System Properties --><echo message="java.home: ${java.home}" /><echo message="user.home: ${user.home}" /><!-- Custom Properties --><echo message="name.last: ${name.last}" /><echo message="name.first: ${name.first}" /><!-- Ant Built-in Properties --><echo message="ant.file: ${ant.file}" /><echo message="ant.version: ${ant.version}" /><echo message="ant.java.version: ${ant.java.version}" /></target></project>
下一个屏幕快照显示了运行此Ant文件时没有-D
参数提供的任何属性。 请注意,内部规范成功设置的唯一属性是自定义属性。 Java系统属性和内置的Ant属性不受内部设置属性的影响。
通常,Ant的属性是不可变的,这具有很多优点。 但是,当仅仅因为在一个特定的Ant构建文件(或该构建文件引用的属性文件)中声明了一个属性而实际上是为该属性设置了该属性的值时,一定要谨慎。 如果该属性已在其他位置设置,则本地重新定义该属性的尝试只会错误地发布该属性的值,而该值实际上并不适用。
翻译自: https://www.javacodegeeks.com/2013/08/ant-properties-nuances.html