我想在我的ant构建文件中设置一些属性,其名称基于ant的内置属性。特别是,我想设置一个属性:
<property name="${ant.project.name}.compiled" value="true" />
然而,当我尝试这个时,$ {ant.project.home}部分没有扩展。
是否可以使用属性值作为其他属性的名称,如果是,如何使用?
答案 0 :(得分:2)
<property name="name.holder" value="iamholder" />
<property name="${name.holder}.flag" value="true" />
<echoproperties></echoproperties>
结果:
[echoproperties] iamholder.flag=true
这绝对是有效的ant代码,属性iamholder.flag获取值true。 如果$ {name.holder}没有扩展,则意味着它尚未设置(就像我的样本中的第一行缺失一样)。 无论如何,这仍然不能完全解决你的问题,因为你几乎没有办法获得这个属性的值,因为你不知道它的名字,你不能在纯蚂蚁中做嵌套的解决方案。根据您的尝试,它可能仍然对您有用。这个可以工作(请记住,只要设置了属性,直到1.8值才无关紧要):
<target name="compile_stuff" unless="${name.holder}.flag">
<echo>compiling...</echo>
</target>
要真正获得此类属性的值,您必须使用其中一个答案中建议的ant-contrib的 propertycopy 。这样,您就可以在您知道其名称的属性中获取值。只需确保在使用之前完成操作,并将覆盖参数设置为true(您的帖子暗示您将设置更多这样的属性,但不覆盖您的最终属性无法更改)。使用这些属性的另一个选择是使用ant宏。
答案 1 :(得分:0)
我认为唯一的方法是将您的值回显到.properties文件,然后重新加载它们。 但是,你应该问自己是否真的需要它;当我上次使用蚂蚁时,我试图做同样的事情但结论我并不是真的需要。
是
$ ant.project.home.compiled
不仅有用吗?
答案 2 :(得分:0)
<property name="projectNameCompiled" value="${ant.project.name}.compiled" />
<property name="${projectNameCompiled}" value="true" />
<propertycopy property="final" from="${ant.project.name}.compiled" />
属性 final 包含值 true 。
答案 3 :(得分:0)
有几种方法可以实现这一点,请参阅Ant FAQ
通过macrodef的一种可能的解决方案是模拟antcontrib / propertycopy任务,但不需要任何外部库。