加载两个extenal属性文件时,无法使用ant-contrib取消设置属性

时间:2012-01-25 14:49:31

标签: apache ant build-automation ant-contrib

所以...我有build.xml从基础加载属性文件。

然后,作为目标,我执行以下操作:

<var name="Var1" value="<property_from_**first**_loaded_property_file>" />
<var name="<property_from_**first**_loaded_property_file>" unset="true"/>
<property file="../<other directory>/<**second**_property_file>.properties" />
<var name="Var2" value="<property_from_**second**_loaded_property_file>"/>

这里的ceavat都是 相同的 属性名称。它无法改变。

所以,最后,我应该获得如下属性:

Var1=<property_from_**first**_loaded_property_file>

Var2=<property_from_**second**_loaded_property_file>

但相反 - 我得到的迹象表明,第一个属性文件中的属性(Var1)未被设置,然后从第二个属性文件中填充新值。 ant-contribs unset应该处理的事情:/ ......类似于:

Var1 = Var2

为什么我没有得到预期的结果?

3 个答案:

答案 0 :(得分:1)

我认为问题在于,即使您将变量加载到反对贡献var中,它仍然首先是property,因此是不可变的。

我知道你无法更改属性文件,但是你对脚本本身有什么样的自由?您可以尝试利用范围规则和antcallback任务来确定变量加载的范围。

例如,以下内容可以实现 - 尽管有点混乱 - 我认为你会追求的是:

<?xml version="1.0" encoding="utf-8"?>
<project name="Test" basedir=".">

    <path id="ant.classpath">
        <fileset dir="${basedir}">
            <include name="ant-contrib_AP.jar"/>
        </fileset>
    </path>

    <taskdef resource="net/sf/antcontrib/antcontrib.properties" classpathref="ant.classpath"/>

    <target name="test">

        <antcallback target="load-more-prop" return="Var2"/>

        <loadproperties>
            <file file="prop1.properties"/>
        </loadproperties>

        <property name="Var1" value="${var}" />

        <echo>${Var1}</echo>
        <echo>${Var2}</echo>

    </target>

    <target name="load-more-prop">

        <loadproperties>
            <file file="prop2.properties"/>
        </loadproperties>

        <property name="Var2" value="${var}" />
    </target>
</project>

在我的控制台中,我看到:

Buildfile: C:\Users\mfelzani\workspace-junk\junk\build.xml
test:
load-more-prop:
 [echo] 7
 [echo] 1
BUILD SUCCESSFUL
Total time: 905 milliseconds

分别与我在prop1.properties和prop2.properties中为var属性设置的值相匹配。

答案 1 :(得分:0)

你无法取消该值。

WRONG: <var name="<property_from_**first**_loaded_property_file>" unset="true"/>

您必须取消设置变量

CORRECT: <var name="Var1" unset="true"/>

答案 2 :(得分:0)

如果您需要覆盖某些现有属性或userproperty(通过ant命令行定义的那些属性 - 参数-Dkey = value),您可以使用Ant Plugin Flaka作为antcontrib的替代方案。
使用Flaka的let任务,您可以创建新属性或直接覆盖任何现有属性:

<project xmlns:fl="antlib:it.haefelinger.flaka">

 <property name="foo" value="bar"/>

 <!-- create new property -->
 <fl:let>foo := 'baar'</fl:let>
 <echo>$${foo} => ${foo}</echo>

 <!--
  overwrite existing property
  notice the double '::' in foo ::= 'baz'
 -->
 <fl:let>foo ::= 'baz'</fl:let>
 <echo>$${foo} => ${foo}</echo>

</project>