更新属性文件后重新加载属性

时间:2012-02-01 15:03:44

标签: ant properties

我正在尝试使用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>.

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

6 个答案:

答案 0 :(得分:6)

您可以使用忽略主目标运行时属性的antcall任务调用新的ant运行时 - 只需确保包含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

答案 1 :(得分:2)

正如sudocode已经提到的,在Core Ant中,属性是不可变的 - 这是有充分理由的 使用unset中的Antelope Ant Task任务,您可以取消设置文件中设置的所有属性,只需一行:

<unset file="test.properties"/>

之后

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

会奏效。

提示:该任务仅适用于普通属性,而不适用于xmlproperties 但是有一个简单的工作环节,只需使用
<echoproperties prefix="..." destfile="foo.properties"/>
然后再使用<unset file="foo.properties"/>
如果您不想仅为该特定任务使用Antelope,您可以编写具有类似功能的macrodef或自己的任务。

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

此宏允许您在修复一个

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

答案 5 :(得分:0)

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

在下一行提供该文件的参考。

完成:)