Filter a fileset referenced using a refid
Asked Answered
B

4

20

I have a fileset (which is returned from the Maven Ant task), and it contains all the jars I need to repack. This fileset is referenced by a refid. I only want to include our own jars, so I would like to filter that. But Ant filesets don't support any further attributes or nested tags if a refid is used.

For example, if the fileset is:

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

and I want to have a fileset which contains only

org.foo*.jar

How would I do that?

Bethezel answered 3/3, 2009 at 17:29 Comment(0)
Q
27

Try using a restrict resource collection, which you can use like a fileset in any task that uses resource collections to select the groups of files to operate on.

For example, for a fileset returned from your Maven task referenced via an id called dependency.fileset you can declare a restrict resource collection like so:

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

Note you'll have to declare the resource selector namespace as it isn't part of the built-in Ant namespace:

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

From here you can reference your restrict resource collection in a similar fashion to how you would reference your fileset. For example, to create backups of your filtered set of files:

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

Of course you can inline your restrict resource collection if you so desire:

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

Have a look at the Ant documentation on resource collections for further information.

Quay answered 16/3, 2009 at 9:16 Comment(1)
Good examples of using resources. I think the examples in the Ant docs could be improved, so this is very helpful.Paediatrics
C
1

I think you'll need to write an ant task for that. They're pretty easy to write though.

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

In your task, you'll need to call getProject() and ask it to give you the fileset, walk through it, and create a new one.

Caniff answered 3/3, 2009 at 19:47 Comment(0)
N
1

If you are using a sufficiently recent version of Ant and the JDK, for example, Ant 1.7 and JDK 6, then you can use the optional script task to do what you want. (Earlier versions may also work.) The page I linked to, if you scroll down to the text "The goal is to list the filesizes" then you'll see a sample script that creates a Fileset.

This isn't for the faint of heart, and a custom ant task you write yourself will probably be more flexible. But I wanted to point out the option.

Newsstand answered 3/3, 2009 at 20:1 Comment(0)
J
1

I 'm using Ant with Ivy. With the help of Ivy it is possible to filter dependencies for retrieval, with the following code in 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"/>

Maybe a quick look at the Ivy source 'll help?

Julie answered 16/3, 2009 at 9:3 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.