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

Java 从自定义ant任务覆盖ant属性,java,ant,Java,Ant,所以总的问题是: 我们有多个属性文件 <property file="prop1"/> <property file="prop2"/> prop2包含mg2.prop mg2.prop = Hello 如果它们在同一个文件中,并且我查询了mg.prop,我会返回“Hello”。因为它们在不同的文件中,所以这不起作用(我需要在prop2之前加载prop1!) 我编写了一个自定义ant任务,它执行以下操作: String resolved = resolveProper

所以总的问题是:

我们有多个属性文件

<property file="prop1"/>
<property file="prop2"/>
prop2包含mg2.prop

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

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

String resolved = resolveProperty(propertyName);
getProject().setProperty(propertyName, resolved);
<concat destfile="resolved.properties">
    <fileset file="1.properties" />
    <fileset file="2.properties" />
    <fileset file="3.properties" />
</concat>

<property file="resolved.properties"/>
如果我跑

log("Resolved property value = " + getProject().getProperty(propertyName)); 
之后,我得到了正确的值

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

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

它向我显示了原始值

关于如何解决这个问题有什么想法吗?

来自Ant手册:

“属性是不可变的:任何设置属性的人都会在构建的其余部分先将其冻结;它们绝对不是变量。”

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


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

以下是我最终如何解决这个问题的-我完成了定制ant任务

最后,我将所有属性文件按与优先级相反的顺序连接到一个文件中

因此,如果我希望3.properties中的属性覆盖2.properties和1.properties中的属性,我会执行以下操作:

String resolved = resolveProperty(propertyName);
getProject().setProperty(propertyName, resolved);
<concat destfile="resolved.properties">
    <fileset file="1.properties" />
    <fileset file="2.properties" />
    <fileset file="3.properties" />
</concat>

<property file="resolved.properties"/>

您也可以使用的重置值

从文档:

下一个示例显示正在设置、回显、取消设置的属性,然后 重置:


${x}
${x}

谢谢Russell-我确实在手册中看到了这一点,我只是认为自定义任务可以解决这个问题:)显然是错误的。我确实用了另一种方法解决了这个问题——见下文。