过滤使用refid引用的文件集

时间:2009-03-03 17:29:01

标签: ant fileset

我有一个文件集(从Maven Ant任务返回),它包含我需要重新打包的所有jar文件。此文件集由refid引用。我只想包括我们自己的罐子,所以我想过滤一下。但是,如果使用refid,Ant文件集不支持任何其他属性或嵌套标记。

例如,如果文件集是:

org.foo.1.jar
org.foo.2.jar
log4j.jar

我希望有一个仅包含

的文件集
org.foo*.jar

我该怎么做?

4 个答案:

答案 0 :(得分:27)

尝试使用restrict资源集合,您可以在任何使用资源集合的任务中使用fileset来选择要操作的文件组。

例如,对于通过名为fileset的ID引用的Maven任务返回的dependency.fileset,您可以声明restrict资源集合,如下所示:

<restrict id="filtered.dependencies">
    <fileset refid="dependency.fileset"/>
    <rsel:name name="org.foo*.jar"/>
</restrict>

请注意,您必须声明资源选择器命名空间,因为它不是内置Ant命名空间的一部分:

<project xmlns:rsel="antlib:org.apache.tools.ant.types.resources.selectors">
    ...
</project>

从这里,您可以以与引用restrict类似的方式引用您的fileset资源集合。例如,要创建已过滤文件集的备份:

<copy todir=".">
    <restrict refid="filtered.dependencies"/>
    <globmapper from="*" to="*.bak"/>
</copy>

当然,如果您愿意,可以内联您的restrict资源集合:

<copy todir=".">
    <restrict>
        <fileset refid="dependency.fileset"/>
        <rsel:name name="org.foo*.jar"/>
    </restrict>
    <globmapper from="*" to="*.bak"/>
</copy>

有关详细信息,请查看resource collections上的Ant文档。

答案 1 :(得分:1)

我认为你需要为此编写一个ant任务。虽然它们很容易写。

请参阅http://ant.apache.org/manual/develop.html#writingowntask

在你的任务中,你需要调用getProject()并让它给你文件集,遍历它,并创建一个新文件集。

答案 2 :(得分:1)

如果您使用的是最新版本的Ant和JDK,例如Ant 1.7和JDK 6,那么您可以使用optional script task来执行您想要的操作。 (早期版本也可以使用。)我链接到的页面,如果向下滚动到文本“目标是列出文件大小”,那么您将看到一个创建文件集的示例脚本。

这不适合胆小的人,你自己写的自定义蚂蚁任务可能会更灵活。但我想指出这个选项。

答案 3 :(得分:1)

我正在使用Ivy的Ant。在Ivy的帮助下,可以使用ivy.xml中的以下代码过滤依赖项以进行检索:

<dependency name="Project1" rev="latest.integration" transitive="true" conf="modlibs">
<exclude name="${exclusionRegEx}" matcher="regexp" />
</dependency>
<dependency name="Project2" rev="latest.integration" transitive="false" conf="modules"/>

也许快速浏览常春藤来源会帮忙吗?