蚂蚁属性细微差别

每隔一段时间,我会想起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构建自动设置的值。

runningAntShowPropertiesTargetNoOverridden

下一个屏幕快照显示了尝试通过-D参数传递为构建中使用的属性提供值的尝试。 如示例所示,即使系统属性和Ant内置属性也可以使用-D属性设置覆盖,但ant.file属性不会被覆盖。

runningAntShowPropertiesDArgOverride

指定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属性不受内部设置属性的影响。

runningAntShowPropertiesInternallyAttemptedOverride

通常,Ant的属性是不可变的,这具有很多优点。 但是,当仅仅因为在一个特定的Ant构建文件(或该构建文件引用的属性文件)中声明了一个属性而实际上是为该属性设置了该属性的值时,一定要谨慎。 如果该属性已在其他位置设置,则本地重新定义该属性的尝试只会错误地发布该属性的值,而该值实际上并不适用。

参考:来自JCG合作伙伴 Dustin Marx的Ant Properties Nuances来自“实际事件启发”博客。

翻译自: https://www.javacodegeeks.com/2013/08/ant-properties-nuances.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值