Ant Best Practices: Use ZipFileSet

by Julian Simpson on July 13, 2008

(image taken from the superbly named MasochismTango’s photostream)


Welcome to the lucky thirteenth edition of Ant Best Practices. You probably guessed this one: Use the ZipFileSet type when you make a zip file in Ant.

This one slipped past me recently. We were working on a web project and the developers added a cache-busting feature to stop CSS stylesheets being cached by the reader’s browser. So they wrote build targets to:

  • fetch the static content
  • lay it out in a directory, nested under an arbitrary kind of key
  • zip it all up for deployment later

It looked something like this:

<project name="web" default="zipfile">
  <property name="build.dir" value="build" />
  <property name="tmp" value="${build.dir}/tmp" />
  <target name="zipfile">
    <copy todir="${tmp}/static/random_token">
      <fileset dir="code" />
    </copy>
<!-- more static files, you getthe idea -->
    <zip file="${build.dir}/static.zip">
      <fileset dir="${tmp}" />
    </zip>
  </target>
</project>


Sounds fine, right?

Hmm. Actually, no. The approach gets top marks for actually working, but where I should have intervened was the copying of the files about to make the paths that were desired. In this case, the <zipfileset> lets you pluck files from wherever they might be, and put them into the right place:

<project name="web" default="zipfile">
  <property name="build.dir" value="build" />
  <target name="zipfile">
  <zip file="${build.dir}/static.zip">
    <zipfileset prefix="random_token" dir="code"/>
  </zip>
  </target>
</project>


Really, that’s it. I was originally quite surprised that it made Eric’s original list of practices: It’s quite a simple change to make. But on writing about it I’m thinking this should be a refactoring. It’d be great to invoke an automated refactoring and introduce a zipfileset whenever you saw tedious copying and zipping operations. Anyway. Do this, and it will make your build faster and easy to read. Result.

Share with the group:
  • Digg
  • del.icio.us
  • Facebook
  • DZone
  • LinkedIn
  • Slashdot
  • StumbleUpon

Related posts:

  1. Build Refactoring Build Refactoring: Refactoring is a nice term for making...
  2. Ant will eat itself I was sorely tempted to save this for April...
  3. Ant 1.8.0 released The Apache Ant team just announced Ant 1.8.0.  The...

Related posts brought to you by Yet Another Related Posts Plugin.

blog comments powered by Disqus

Previous post: Build status screen saver for Mac OS X

Next post: Continuous Integration – emphasis on tests not builds?