tags:

views:

3638

answers:

4

I have a fileset (which is returned from the maven ant task), and it contains all 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 doesn't support any further attributes or nested tags if a refid is used.

Example:

fileset is:

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

I now want to have a fileset which contains only org.foo*.jar

How do I do that?

A: 

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.

Scott Stanchfield
A: 

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.

Eddie
A: 

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?

stokey
+6  A: 

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.

Simon Lieschke
Good examples of using resources. I think the examples in the Ant docs could be improved, so this is very helpful.
trenton
Resource collections link moved to http://ant.apache.org/manual/Types/resources.html#collection
Dan Midwood
Cheers Dan, I've updated the link.
Simon Lieschke