Simpler Ant Builds With the Ant Script Library
Introduction
Ant may be unfashionable these days, but it still has its advantages. Key among these are familiarity and simplicity: most Java developers have worked with Ant, and with an Ant build what you get is what you see. A major disadvantage, though, is that Ant provides very little out-of-the-box. When you start a new project, you’ve got a lot of grunt work to endure just to get your code compiled, packaged, and tested. An all-too-common solution, in the grand tradition of make, is to copy a build file from an existing project as an easy starting point.
Over the years, though, Ant has gradually expanded support for creating reusable build file snippets. On top of this a few projects have emerged which aim to simplify and standardise your Ant builds, including:
- EasyAnt
- Ant Master Build Scripts
- Ant Script Library
Today I’ve taken my first proper look at the latter, and so far I like what I see.
The Ant Script Library
In the author Joe Schmetzer’s own words:
The Ant Script Library (ASL) is a collection of re-usable Ant scripts that can be imported into your own projects. The ASL provides a number of pre-defined targets that simplify setting up build scripts for a new project, bringing re-use and consistency to your own Ant scripts.
ASL consists of several Ant XML files, each of which provides a group of related functionality via predefined targets. For example, the asl-java-build.xml file defines targets for compiling and packaging Java code. The asl-java-test.xml file extends this with the ability to run JUnit tests, and so on. Essentially, ASL packages up all the grunt work, allowing you to concentrate on the small tweaks and extra targets unique to your project. The modular structure of ASL, combined with the fact that it is just Ant properties and targets, makes it easy to take what you like and leave the rest.
An Example
Allow me to illustrate with a simple project I have been playing with. This project has a straightforward directory structure:
- <project root>
- asl/ – the Ant Script Library
- build.xml – Ant build file
- lib/ – Jar file depedencies
- src/ – Java source files
- test/ – JUnit-based test source files
To add ASL to my project, I simply downloaded it from the project download page and unpacked it in the asl/ subdirectory of my project1. Then I can start with a very simple build file that supports building my code and running the tests:
<?xml version="1.0" encoding="utf-8"?>
<project name="zutubi-android-ant" default="dist">
<property name="java-build.src-dir" location="src"/>
<property name="java-test.src-dir" location="test"/>
<property name="java-build.lib-dir" location="libs"/>
<property name="asl.dir" value="asl"/>
<import file="${asl.dir}/asl-java-build.xml"/>
<import file="${asl.dir}/asl-java-test.xml"/>
</project>
Notice that I am using non-standard source locations, but that is easily tweaked using properties which are fully documented. With this tiny build file, let’s see what targets ASL provides for me:
$ ant -p Buildfile: build.xml Main targets: clean Deletes files generated by the build compile Compiles the java source copy-resources Copies resources in preparation to be packaged in jar dist Create a distributable for this java project generate Generates source code jar Create a jar for this java project test-all Runs all tests test-integration Runs integration tests test-run-integration Runs the integration tests test-run-unit Runs the unit tests test-unit Runs unit tests Default target: dist
It’s delightfully simple!
Adding Reports
It gets better: ASL also provides reporting with tools like Cobertura for coverage, FindBugs for static analysis and so on via its asl-java-report.xml module. The full range of supported reports can be seen in the report-all target:
<target name="report-all"
depends="report-javadoc, report-tests, report-cobertura, report-jdepend, report-pmd, report-cpd, report-checkstyle, report-findbugs"
description="Runs all reports"/>
Having support for several tools out-of-the-box is great. For my project, however, I’d like to keep my dependencies down and I don’t feel that I need all of the reporting. Although the choice of reports is not something that is parameterised by a property, it is still trivial to override by providing your own report-all target. This shows the advantage of everything being plain Ant targets:
<?xml version="1.0" encoding="utf-8"?>
<project name="zutubi-android-ant" default="dist">
<property name="java-build.src-dir" location="src"/>
<property name="java-test.src-dir" location="test"/>
<property name="java-build.lib-dir" location="libs"/>
<property name="asl.dir" value="asl"/>
<import file="${asl.dir}/asl-java-build.xml"/>
<import file="${asl.dir}/asl-java-test.xml"/>
<import file="${asl.dir}/asl-java-report.xml"/>
<target name="report-all"
depends="report-javadoc, report-tests, report-cobertura, report-pmd, report-checkstyle"
description="Runs all reports"/>
</project>
Here I’ve included the java-report module, but defined my own report-all target that depends on just the reports I want. This keeps things simple, and allows me to trim out a bunch of ASL dependencies I don’t need.
Conclusion
I’ve known of ASL and such projects for a while, but this is the first time I’ve actually given one a go. Getting started was pleasantly simple, as was applying the small tweaks I needed. So next time you’re tempted to copy an Ant build file, give ASL a shot: you won’t regret it!
—
1 In this case I downloaded the full tarball including dependencies, which seemed on the large side (21MB!) but in fact can be easily trimmed by removing the pieces you don’t need. Alternatively, you can start with the basic ASL install (sans dependencies) and it can pull down libraries for you. Sweet :).
This entry was posted on Thursday, July 29th, 2010 at 8:39 pm and is filed under Agile, Build, Java, Project Automation, Technology. You can follow any responses to this entry through the RSS 2.0 feed. You can leave a response, or trackback from your own site.

July 29th, 2010 at 11:42 pm
I found this really interesting and useful. Is there a reason you picked Ant Script Library to examine over the other two? Any issues or things to watch out for when using Ant Script Library?
July 30th, 2010 at 12:02 am
Hi Basil,
Thanks for the kind words. The main reason I chose ASL was I found it the most approachable project: in a quick scan of all the project home pages it was the most clear, with the best documentation. This made it the easiest one to try first. It also doesn’t hurt that I briefly met Joe at CITCON 2009, so had a face to put to the library. I’m not averse to giving the others a go when I get a chance!
Re: issues, I haven’t found too many yet. My main gripe so far is that the build does not fail on analysis failures (e.g. checkstyle violations, PMD problems) by default, which is the behaviour I would prefer. I haven’t dug into this deeply yet, though.