Ant </property>中的有效<property>名称

时间:2010-02-22 19:27:28

标签: ant

我想在我的ant构建文件中设置一些属性,其名称基于ant的内置属性。特别是,我想设置一个属性:

<property name="${ant.project.name}.compiled" value="true" />

然而,当我尝试这个时,$ {ant.project.home}部分没有扩展。

是否可以使用属性值作为其他属性的名称,如果是,如何使用?

4 个答案:

答案 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)

但是,它可以做到,有点难看。你需要&lt; propertycopy&gt;来自ant-contrib的任务。以下是一个示例

<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任务,但不需要任何外部库。