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

时间:2012-01-16 19:25:43

标签: java ant

总体问题是:

我们有多个属性文件

<property file="prop1"/>
<property file="prop2"/>

prop1包含一个类似于:

的属性
mg.prop = ${mg2.prop}

prop2包含mg2.prop

mg2.prop = Hello

如果他们在同一个文件中并且我查询了mg.prop,我会回复“你好”。因为它们在单独的文件中,所以不起作用(我需要在prop2之前加载prop1!)

我编写了一个自定义ant任务,执行以下操作:

String resolved = resolveProperty(propertyName);
getProject().setProperty(propertyName, resolved);

如果我跑

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

之后,我得到了正确的价值。

但是在Ant脚本中,如果我这样做

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

它显示了原始值。

关于如何解决这个问题的任何想法?

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

以下是我最终解决这个问题的方法 - 我对自定义蚂蚁任务进行了调整。

我最终将所有属性文件连接成一个,按优先顺序相反。

因此,如果我希望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"/>

答案 2 :(得分:1)

您还可以使用var taskant-contrib来重置值。

来自doc:

  

下一个示例显示正在设置,回显,未设置的属性   复位:

<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 -->