可以通过属性文件设置Ant属性,从属性文件中解析其他属性吗?
例如,我可以这样做:
<property name="prop1" value="in_test_xml1" />
<property name="prop2" value="${prop1}" />
Run Code Online (Sandbox Code Playgroud)
并且prop2变为"in_test_xml1".非常好.
但在这种情况下,使用输入属性文件时:
prop1=sample_prop
prop2=${prop1}
Run Code Online (Sandbox Code Playgroud)
prop2未设置为"sample_prop"
因此,当执行解析的属性位于ant文件本身时,解析其他属性的属性似乎才有效.
这是预期还是我错过了什么?
sud*_*ode 20
Ant确实支持文件内属性扩展,请参阅属性任务手册中的"属性文件"部分.
以下示例显示了已解析的属性:
第一个属性文件:
$ cat props1.properties
prop1=world
prop2=hello ${prop1}
Run Code Online (Sandbox Code Playgroud)
第二个属性文件:
$ cat props2.properties
prop3=goodbye ${prop1}
Run Code Online (Sandbox Code Playgroud)
构建文件:
<project default="test">
<property file="props1.properties"/>
<property file="props2.properties"/>
<property name="prop4" value="${prop3}, good luck"/>
<target name="test">
<echo message="prop1 = ${prop1}"/>
<echo message="prop2 = ${prop2}"/>
<echo message="prop3 = ${prop3}"/>
<echo message="prop4 = ${prop4}"/>
</target>
</project>
Run Code Online (Sandbox Code Playgroud)
输出:
$ ant
Buildfile: build.xml
test:
[echo] prop1 = world
[echo] prop2 = hello world
[echo] prop3 = goodbye world
[echo] prop4 = goodbye world, good luck
BUILD SUCCESSFUL
Total time: 0 seconds
Run Code Online (Sandbox Code Playgroud)
还有其他一种不适合你的财产解决方案吗?
编辑
在您发表评论后,我现在明白您正在使用-propertyfile命令行选项指定要加载的Ant的属性文件(而不是像我上面那样在构建文件本身中指定文件).
我对此进行了快速测试,发现Ant 1.7.1没有对使用该命令行选项加载的文件进行文件内属性扩展.但Ant 1.8.2确实如此.
这是Ant Bug 18732.您应该可以通过更新您的Ant版本来解决.
此任务的一个更简单的解决方案是使用Ant-contrib 任务:Propertycopy。
从手册中:
<property name="org" value="MyOrg" />
<property name="org.MyOrg.DisplayName" value="My Organiziation" />
<propertycopy name="displayName" from="org.${org}.DisplayName" />
Sets displayName to "My Organiziation".
Run Code Online (Sandbox Code Playgroud)