从自定义ant任务覆盖ant属性

3
所以总的问题是:
我们有多个属性文件。
<property file="prop1"/>
<property file="prop2"/>

prop1包含一个类似于以下的属性:

mg.prop = ${mg2.prop}

prop2 包含 mg2.prop

mg2.prop = Hello

如果它们在同一个文件中且我查询mg.prop,那么我会得到“Hello”的结果。但由于它们在不同的文件中,这不起作用(我需要先加载prop1再加载prop2!)
我编写了一个自定义的ant任务,它执行以下操作:
String resolved = resolveProperty(propertyName);
getProject().setProperty(propertyName, resolved);

如果我运行

log("Resolved property value = " + getProject().getProperty(propertyName)); 

接着,我获得了正确的值。

然而,在Ant脚本中,如果我执行

<echo message="${mg.prop}"/> 

它显示我原始值。

你有没有什么想法如何解决这个问题?

3个回答

3

根据Ant手册:

“属性是不可变的:谁先设置了一个属性,就会将其冻结给整个构建过程;它们绝对不是变量。”

http://ant.apache.org/manual/Tasks/property.html

根据你的情况,你可能可以通过加载prop1两次来完成你想要的目标,使用loadproperties和一个过滤器链。第一次只获取不包含“{mg2.prop}”的行,第二次只获取包含它的行。

http://ant.apache.org/manual/Tasks/loadproperties.html http://ant.apache.org/manual/Types/filterchain.html#linecontains


谢谢Russell - 我在手册中确实看到了这个,只是我认为自定义任务可以解决它 :) 显然我的想法是错误的。不过我已经使用另一种方法解决了它 - 请见下文。 - Mike G

2
你还可以使用Ant-contribvar任务来重置值。
从文档中可以看到:

The next example shows a property being set, echoed, unset, then reset:

<property name="x" value="6"/>
<echo>${x}</echo>   <!-- will print 6 -->
<var name="x" unset="true"/>
<property name="x" value="12"/>
<echo>${x}</echo>   <!-- will print 12 -->

1
这是我最终解决问题的方法 - 我放弃了自定义的ant任务。
我最终将所有属性文件连接成一个,按优先级的相反顺序进行连接。
因此,如果我想要从3.properties获取属性并覆盖2.properties和1.properties中的属性,我会执行以下操作:
<concat destfile="resolved.properties">
    <fileset file="1.properties" />
    <fileset file="2.properties" />
    <fileset file="3.properties" />
</concat>

<property file="resolved.properties"/>

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