Ant属性能够解析其他属性吗?

17

Ant属性文件能否设置并解析其他属性文件中的属性?

例如,我可以这样做:

<property name="prop1" value="in_test_xml1" />
<property name="prop2" value="${prop1}" />

然后prop2就变成了“in_test_xml1”。这很好。

但是在使用输入属性文件的情况下:

prop1=sample_prop
prop2=${prop1}

prop2没有设置成"sample_prop"

所以从其他属性中解析属性似乎只在属性本身在ant文件中时才起作用。

这是预期的吗?还是我漏了什么?

2个回答

23
Ant 支持文件内属性扩展,参见手册中 Property 任务的 Property File 部分。
以下示例显示了属性的解析:
- 在单个属性文件中 - 从一个属性文件中获取另一个属性文件的属性 - 在构建文件中
第一个属性文件:
$ cat props1.properties
prop1=world
prop2=hello ${prop1}

第二个属性文件:

$ cat props2.properties
prop3=goodbye ${prop1}

构建文件:
<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>

输出:

$ 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

你有没有遇到其他无法解决的属性解析问题?

编辑

根据你的评论,我现在明白你是使用-propertyfile命令行选项来指定Ant要加载的属性文件(而不是像上面那样在构建文件中指定文件)。

我对此进行了快速测试,并发现Ant 1.7.1没有对使用该命令行选项加载的文件进行文件内属性扩展。但是Ant 1.8.2会这样做。

这是Ant Bug 18732。通过更新Ant版本,您应该能够解决这个问题。


我正在通过命令行从属性文件中导入属性。在这种情况下,我没有看到属性被展开。 - glutz
好的,所以您正在使用“-propertyfile”命令行选项。我已经更新了我的答案。 - ewan.chalmers
从使用ANT 1.8.4进行本地测试来看,似乎在命令行上无法工作,其中一个属性引用另一个属性。例如:ant -Dprop1=world '-Dprop2=hello ${prop1}' test。@ewan.chalmers - ptha
@ptha,我已经好几年没有使用Ant了,现在就轮到你了 :) - ewan.chalmers

6
这项任务的更简单解决方案是使用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".

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接