2012-02-01 71 views
3

我想在使用propertyfile任务更新它之后读取属性。类似于更新属性文件后重新加载属性

<property file="test.properties" /> 
<echo>before :: ${modules}</echo> 

<propertyfile file="test.properties" > 
    <entry key="modules" type="string" operation="+" value="foo" /> 
</propertyfile> 

<property file="${status.path}/test.properties" /> 
<echo>after :: ${modules}</echo>. 

它似乎没有加载第二次。但属性文件已更新。

回答

2

由于sudocode已经提到,在核心Ant属性是不可变的 - 出于很好的理由。
Antelope Ant Task S中unset任务你能够取消设置在一个文件中设置的所有属性有一个内衬:

<unset file="test.properties"/> 

事后

<propertyfile file="test.properties" > 
    <entry key="modules" type="string" operation="+" value="foo" /> 
</propertyfile> 

会工作。

提示:该任务仅适用于普通属性,不适用于xmlproperties。
但有一个简单的workararound,只需使用
<echoproperties prefix="..." destfile="foo.properties"/>
事后
<unset file="foo.properties"/>
如果你不想使用羚羊为特定的任务而已,你可以写一个macrodef或自己的任务有类似的功能。

0

Ant属性是不可变的 - 一旦设置,它们就会被修复。因此,重新加载属性文件不会刷新已设置属性的值。

0

该宏允许更改后固定一个

<macrodef name="set" > 
    <attribute name="name"/> 
    <attribute name="value"/> 
    <sequential> 
     <script language="javascript"> 
      <![CDATA[ 
      project.setProperty("@{name}", "@{value}"); 
      ]]> 
     </script> 
    </sequential> 
</macrodef> 
1

对于这种情况的属性值,当整个属性文件被加载两次,我建议使用不同的前缀的第一和第二负载。第一个加载一个prefix属性等于first。使用此前缀访问属性,即属性foo将可作为first.foo访问。然后保存属性文件并重新加载,但这次没有前缀。您将在适当的地方获得修改后的属性。

不使用前缀,第二次加载将不会执行任何操作,因为ant会阻止属性重写。其他人已经指出。

5

您可以调用与antcall任务,忽略你的主要目标运行时的性能提供了新的蚂蚁运行 - 只要确保包括inheritAll="false"

<target name="main"> 
    <property file="test.properties"/> 
    <echo>before :: ${modules}</echo> 

    <propertyfile file="test.properties"> 
     <entry key="modules" type="string" operation="+" value="foo" /> 
    </propertyfile> 

    <antcall target="second-runtime" inheritAll="false"/> 
</target> 

<target name="second-runtime"> 
    <property file="${status.path}/test.properties" /> 
    <echo>after :: ${modules}</echo> 
</target> 

antcall refrence

0

你可以创建一个新的属性文件并将该属性保存在新文件中。

在下一行提供该文件的引用。

完成:)