我正在尝试使用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>.
第二次似乎没有加载。但属性文件已更新。
答案 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>
答案 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)
您可以创建新的属性文件并将该属性保存在新文件中。
在下一行提供该文件的参考。
完成:)