在使用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>.
第二次似乎没有加载。但属性文件已更新。
您可以使用忽略主目标运行时属性的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参考
正如sudocode已经提到的,在Core中Ant属性是不可变的,这是有充分理由的
使用Antelope Ant Tasks中的未设置任务,您可以使用一行代码取消设置文件中设置的所有属性:
<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或自己的具有类似功能的任务。
对于这种情况,当整个属性文件被加载两次时,我建议在第一次和第二次加载时使用不同的前缀。首先加载prefix
属性等于first
。访问带有此前缀的属性,即属性foo
将作为first.foo
访问。然后保存属性文件并再次加载,但这次没有前缀。您将在合适的地方获得修改后的属性。
如果不使用前缀,第二次加载将不起任何作用,因为ant会阻止属性重写。其他人已经指出了这一点。
Ant属性是不可变的-一旦设置,它们就是固定的。因此,重新加载属性文件不会刷新已经设置的属性的值。
此宏允许您在修复一个后更改属性值
<macrodef name="set" >
<attribute name="name"/>
<attribute name="value"/>
<sequential>
<script language="javascript">
<![CDATA[
project.setProperty("@{name}", "@{value}");
]]>
</script>
</sequential>
</macrodef>
您可以创建一个新的属性文件并将属性保存在新文件中。
在下一行中提供文件的引用。
完成:)