2012-01-16 85 views
2

所以整体的问题是这样的:从定制Ant任务改写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}"/> 

它让我看到原来的值。

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

回答

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"/> 
3

从蚂蚁手册:

“属性是不可改变的:谁设置属性首先冻结其用于构建的休息;他们是最绝对不变量”

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

+0

感谢拉塞尔 - 我没有在手册中看到这一点,我只是认为一个自定义任务可以解决这个错误:)显然。我用一种不同的方法解决了它 - 见下文。 – 2012-01-17 13:17:47

1

您还可以使用ant-contribvar task重置价值。

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