Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Creating an empty placeholder fileset in Ant

Tags:

ant

So, here's the situation: I have a parent buildfile that defines a compilation task, and I want child buildfiles to optionally be able to add more JARs (which could be wherever) on to the classpath used by that compilation task.

Not all child buildfiles will have these additional dependencies, so I don't want to force them to define the additional dependency fileset. They should just be able to include the parent, and the compile task should just work.

(Obviously there are other required properties that configure the source directory and so on, but they don't enter into this. Also, the actual include/inheritance problem is a good bit more complicated, but hopefully whatever the right thing is for the simple case will work in the complex case too.)

I have something that works: The compile task in the parent buildfile refers to the additional dependency fileset regardless:

<target name="compile" depends="init-additional-dependencies">
  <fileset id="global.dependency.fileset" dir="${global.library.directory}">
     <include name="**/*.jar"/>
  </fileset>
  <javac ...>
    <classpath>
      <!-- should be the same for all buildfiles -->
      <fileset refid="global.dependency.fileset"/>

      <!-- should be populated by child buildfiles -->
      <fileset refid="additional.dependency.fileset"/>
    </classpath>
  </javac>
</target>

...and the parent buildfile also has a task that creates this fileset, empty, so that javac doesn't blow up. However, the way I'm creating the empty fileset is dopey:

<target name="init-additional-dependencies">
  <!-- override me! -->
  <fileset id="additional.dependency.fileset" dir=".">
    <include name="placeholder.does.not.exist.so.fileset.is.empty"/>
  </fileset>
</target>

This works, but seems dumb, and it's hard to believe there isn't a better approach. What is that better approach?

like image 587
David Moles Avatar asked Jan 26 '12 19:01

David Moles


1 Answers

I don't think there's been much discussion about this, so no 'convention' as such exists. The way that fileset works though, exclusions 'trump' inclusions, thus

<fileset refid="additional.dependency.fileset" dir="." excludes="**" />

should always be empty. That seems slightly preferable to both your placeholder file name technique, and the placeholder directory name and erroronmissingdir method.

The problem arises because, by default, there is an implicit include of all files beneath the parent directory of a fileset. Another option - perhaps not of direct use in your case - is to use a filelist instead. Because filelists are constructed from explicitly named files, if you don't name any, they are empty.

<filelist id="additional.dependency.filelist" />

By generalising, you can mix filesets and filelists, if you modify your classpath to use resources:

<filelist id="additional.dependency.resources" />

...

<classpath>
      <!-- should be the same for all buildfiles -->
      <fileset refid="global.dependency.fileset"/>

      <!-- should be populated by child buildfiles -->
      <resources refid="additional.dependency.resources"/>
</classpath>

the reference additional.dependency.resources can be either a fileset or a filelist (including the empty filelist), or any other file-based resource collection.

like image 68
martin clayton Avatar answered Jan 03 '23 12:01

martin clayton