所以。。。我有build.xml,它从basedir加载属性文件。
然后,作为目标,我执行以下操作:
<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)没有被取消设置,然后用第二个属性文件的新值填充。蚂蚁后悔不该处理的事情:/。。。类似于:
Var1 = Var2
为什么我没有得到预期的结果?
我认为问题是,即使您将变量加载到一个antcontrib var
中,它仍然首先是一个ant 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:Usersmfelzaniworkspace-junkjunkbuild.xml
test:
load-more-prop:
[echo] 7
[echo] 1
BUILD SUCCESSFUL
Total time: 905 milliseconds
它与我分别在prop1.properties和prop2.properties中为var属性设置的值相匹配。
您不能取消设置该值。
WRONG: <var name="<property_from_**first**_loaded_property_file>" unset="true"/>
您必须取消设置变量
CORRECT: <var name="Var1" unset="true"/>
如果您需要覆盖某些现有属性或用户属性(通过ant命令行
parameter-Dkey=value定义的属性),您可以使用ant插件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>