总体问题是:
我们有多个属性文件
<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}"/>
它显示了原始值。
关于如何解决这个问题的任何想法?
答案 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 task的ant-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 -->