20

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

例如,如果文件集是:

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

我想要一个仅包含的文件集

org.foo*.jar

我该怎么做?

4

4 回答 4

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>

查看关于资源集合的 Ant 文档以获取更多信息。

于 2009-03-16T09:16:42.497 回答
1

我认为您需要为此编写一个蚂蚁任务。不过,它们很容易编写。

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

在您的任务中,您需要调用 getProject() 并要求它为您提供文件集、遍历它并创建一个新文件集。

于 2009-03-03T19:47:58.953 回答
1

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

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

于 2009-03-03T20:01:57.190 回答
1

我将 Ant 与Ivy一起使用。在 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"/>

也许快速浏览一下常春藤源会有所帮助?

于 2009-03-16T09:03:51.450 回答