2012-01-25 28 views
1

所以...我有build.xml,它从basedir加载属性文件。当加载两个extenal属性文件时,不能用ant-contrib取消属性

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

<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 

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

+0

你想说什么? – rodrigoap

+0

从回声结果我得到的迹象,从Pirts属性文件的值不是未设置,然后从第二个属性文件中填充新值。 ant-contribs未设置应该处理的事情:/ –

+0

属性文件包含什么 – oers

回答

1

我认为这个问题是,即使你加载变量为antcontrib 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属性。

+0

舷窗,队友!!!我检查了这一点assap;) –

+0

真棒和祝你好运。另外,在加载prop1之后,不要害怕在您的“测试”等效目标中为prop2调用loadproperties,以便您可以使用该聚合的属性。另外,对于不一致的loadproperties/property任务使用情况感到抱歉。在那里复制/粘贴的受害者。我现在要修复它以保持一致。 –

+0

如果它确实有效,如果您将此答案标记为“答案”,我会很喜欢它......这将是我的第一个答案!谢谢! :) –

0

您无法取消设置值。

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

你必须取消设置变量

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

是的,我知道,但...嗯...但如果我使用$ {variable_form_first_loaded_properties_file}指定值?我将无法以后将新的值存储到同一个属性名称... –

+0

@HX_unbanned如果它是一个变量它可能工作,但我不知道 – oers

+0

嗯, - 它不工作:(...也许还有其他的方法来比较在两个不同的propfiles相同的名称属性? –

0

如果您需要覆盖某些现有属性或userproperty(通过ant命令行
parameter -Dkey = value定义的属性),则可以使用Ant Plugin Flaka作为antcontrib的替代方法。
随着Flaka的让你的任务创建一个新的属性或覆盖所有现有财产直截了当:

<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>