我有一个path
如下:
<path refid="myjarlocation"/>
现在我想遍历这个路径,对于路径中出现的每个值,我想调用一个macrodef,并将该值作为在marcodef中使用的属性之一。
在目标的情况下,我们可以很容易地这样做:
<foreach target="mytarget" param="jarloc">
<path refid="myjarlocation"/>
</foreach>
我不能使用for each,因为我需要传递多个参数,所以我使用macrodef。因此,问题是如何遍历路径并调用macrodef而不是目标。
我已经做了一些类似的工作,通过使用ant-contrib的for
任务来迭代路径并将path元素传递给macrodef。
首先在项目中获取ant-contrib -参见http://ant-contrib.sourceforge.net/
接下来,在ant构建中定义您的macrodef,包括一些将采用path元素的属性。如:
<macrodef name="awesome-macro">
<attribute name="path-to-deal-with"/>
<attribute name="unrelated-attribute"/>
<sequential>
...
</sequential>
</macrodef>
然后,使用for
任务将路径迭代到pathelements并调用宏:
<for param="path.element">
<fileset dir="${jars.dir}">
<include name="*.jar"/>
</fileset>
<sequential>
<awesome-macro path-to-deal-with="@{path.element}" unrelated-attribute="whatever"/>
</sequential>
</for>
注意,在for循环中使用@{path.element}
而不是${path.element}
来引用循环参数!