Ant属性在Windows中是可变的,但在Unix中不是可变的?

Ant属性在Windows中是可变的,但在Unix中不是可变的?,ant,properties,immutability,unset,ant-contrib,Ant,Properties,Immutability,Unset,Ant Contrib,我正在使用Ant进行自动构建过程 一个目标是检查变量是否已设置,如果未设置,则将其设置为空字符串并将其作为环境键导出到可执行文件。我有多个属性文件,它们要么定义了bla属性,要么没有定义属性。因此,我遍历我的文件列表并执行以下操作: <for list="${propertyfiles}" param="mypropertyfile"> <var name="bla" unset="true" /> <property file="@{myprope

我正在使用Ant进行自动构建过程

一个目标是检查变量是否已设置,如果未设置,则将其设置为空字符串并将其作为环境键导出到可执行文件。我有多个属性文件,它们要么定义了
bla
属性,要么没有定义属性。因此,我遍历我的文件列表并执行以下操作:

<for list="${propertyfiles}" param="mypropertyfile">
    <var name="bla" unset="true" />
    <property file="@{mypropertyfile}.properties" />
    <property name="bla" value=""/>
    ... use the "bla" property for something ... 
</for>
确保我可以使用
bla
属性。我认为使用属性的不变性是明智的。所以

<property name="bla" value=""/>

设置未在“我的属性文件”中定义的属性。如果已定义,则理论上无法覆盖初始属性值

现在奇怪的是:在我的unix系统上,这种方法就像一种魅力,在windows上它不起作用定义的属性值被空字符串覆盖。两台机器都安装了ant 1.8


我知道我可以使用
属性标志以另一种方式解决问题,但我只是想知道这是怎么可能的。如果你能帮助我理解这种不一致的行为,那就太好了

变量和unset是的一部分,因为您没有提到我用1.0b2和1.0b3测试的ant contrib版本。虽然这只是一个数据点,但我认为您可以从假设结果的真实性开始,即ant 1.8中windows和*nix上的
unset=“true”
允许您重新分配以前设置过的不可变属性的值(无论是在for循环内部还是外部),否则不会产生任何效果

因此,在未设置的调用和将属性设置为默认值之间存在一个问题,即在windows上,您的属性未按预期进行设置。因此,我将研究两个可能的原因:

  • 属性文件不符合,例如,您可以尝试运行unix2dos版本,以消除任何意外CRLF/LF混淆,检查您是否使用ISO 8859-1字符编码(您可以使用类似的编码),并用
    \“
    转义任何异常字符
  • 在属性文件中,属性的最后一个定义获胜,因此,例如,您可以在windows属性之后使用linux特定的文件内属性扩展,默认值为
    “”
  • 但是,如果
    ${bla}
    显示您的属性实际上是从文件中正确加载的,那么我将首先将您的代码移出for循环,看看它是否适用于单个情况。我的测试代码:

    <project name="propertyMutator" default="mutator">
    <taskdef resource="net/sf/antcontrib/antlib.xml"/>
    <echo>Running ${ant.version}</echo>
    <target name="mutator">
        <for list="one,two,three" param="mypropertyfile">
            <sequential>
              <var name="bla" unset="true" />
              <property file="@{mypropertyfile}.properties" />
              <echo message="Bla before default is: ${bla}"/>
              <property name="bla" value="default value"/>
              <echo message="Bla after default is: ${bla}"/>
            </sequential>
        </for>
    </target>  
    </project>
    
    印刷品

    Buildfile: C:\workspace\proj\propertyMutator.xml
     [echo] Running Apache Ant(TM) version 1.8.3 compiled on February 26 2012
    mutator:
     [echo] Bla before default is: ${some.var}
     [echo] Bla after default is: ${some.var}
     [echo] Bla before default is: ${bla}
     [echo] Bla after default is: default value
     [echo] Bla before default is: hello3
     [echo] Bla after default is: hello3
    

    在linux和windows上。

    变量和unset是测试的一部分,因为您没有提到我用1.0b2和1.0b3测试的ant contrib版本。虽然这只是一个数据点,但我认为您可以从假设结果的真实性开始,即
    unset=“true”“
    在ant 1.8中的windows和*nix上,如果以前设置过其他不可变属性的值(无论是在for循环内部还是外部),则允许您重新分配该属性的值,否则不会产生任何效果

    因此,在未设置的调用和将属性设置为默认值之间存在一个问题,即在windows上,您的属性未按预期进行设置。因此,我将研究两个可能的原因:

  • 属性文件不符合,例如,您可以尝试运行unix2dos版本,以消除任何意外CRLF/LF混淆,检查您是否使用ISO 8859-1字符编码(您可以使用类似的编码),并用
    \“
    转义任何异常字符
  • 在属性文件中,属性的最后一个定义获胜,因此,例如,您可以在windows属性之后使用linux特定的文件内属性扩展,默认值为
    “”
  • 但是,如果
    ${bla}
    显示您的属性实际上是从文件中正确加载的,那么我将首先将您的代码移出for循环,看看它是否适用于单个情况。我的测试代码:

    <project name="propertyMutator" default="mutator">
    <taskdef resource="net/sf/antcontrib/antlib.xml"/>
    <echo>Running ${ant.version}</echo>
    <target name="mutator">
        <for list="one,two,three" param="mypropertyfile">
            <sequential>
              <var name="bla" unset="true" />
              <property file="@{mypropertyfile}.properties" />
              <echo message="Bla before default is: ${bla}"/>
              <property name="bla" value="default value"/>
              <echo message="Bla after default is: ${bla}"/>
            </sequential>
        </for>
    </target>  
    </project>
    
    印刷品

    Buildfile: C:\workspace\proj\propertyMutator.xml
     [echo] Running Apache Ant(TM) version 1.8.3 compiled on February 26 2012
    mutator:
     [echo] Bla before default is: ${some.var}
     [echo] Bla after default is: ${some.var}
     [echo] Bla before default is: ${bla}
     [echo] Bla after default is: default value
     [echo] Bla before default is: hello3
     [echo] Bla after default is: hello3
    

    在linux和windows上。

    您是否验证了它是否正确加载属性文件并在windows系统上设置了值?在您尝试将
    bla
    设置为空字符串之前,
    显示的
    bla
    内容是什么?我发布的答案中的方法学有什么进展吗?会的如果您能让我们知道原因,那就太好了。您是否验证了它是否正确加载属性文件并在Windows系统上设置了值?在您尝试将
    bla
    设置为空字符串之前,
    显示的
    bla
    内容是什么?您在回答中的方法学有什么进展吗我发帖了?如果你能告诉我们原因,那就太好了。
    Buildfile: C:\workspace\proj\propertyMutator.xml
     [echo] Running Apache Ant(TM) version 1.8.3 compiled on February 26 2012
    mutator:
     [echo] Bla before default is: ${some.var}
     [echo] Bla after default is: ${some.var}
     [echo] Bla before default is: ${bla}
     [echo] Bla after default is: default value
     [echo] Bla before default is: hello3
     [echo] Bla after default is: hello3