Using if:set, unless:set etc. to execute a task conditionally in Ant

September 13, 2013 [Ant, Programming, Tech]

I'm not sure anyone except me is still struggling on with using Ant, but just in case, here is a nice thing.

In Ant 1.9.1 they added a useful feature: instead of needing to use the <if> tag and similar from ant-contrib, you can conditionally execute "any" task.

(In fact, this appears to mean "any task except a macrodef" - see my post Using if:set, unless:set etc. with macrodefs in Ant.)

You need to add these namespaces at the top of your project:

<project
     xmlns:if="ant:if"
     xmlns:unless="ant:unless"
>

and then make any task conditional by adding one of these attributes:

if:set
if:true
if:blank
unless:set
unless:true
unless:blank

if:set and unless:set take a property name and run the task if it is set at all (or unless it is set at all).

<mytask if:set="property.name" other_attrs="" .../>

Where mytask is the name of any ordinary Ant task like echo, jar etc.

(Note there is no ${} around the property name for if:set.)

if:true and unless:true take a value and run the task if it is true (or unless it is true), so they need to be used like this:

<mytask if:true="${property}" other_attrs="" .../>

(Note the ${} here, but not above.)

Similarly, if:blank and unless:blank take a value and run the task if it is blank (or unless it is blank), e.g.:

<mytask if:blank="${property}" other_attrs="" .../>

NOTE: The example in the documentation is wrong (at this time, 2013-09-13) - it uses the property name, but this does not work - you must surround it with ${} to get its value.

The properties can be specified in your build file as normal, or supplied on the command line to ant with -Dproperty.name=value.

Here's an example of using set:

build.xml:

<project
xmlns:if="ant:if"
xmlns:unless="ant:unless"
default="build"
>

&lt;property name="setinxml" value="true"/&gt;

&lt;target name="build"&gt;
    &lt;echo if:set="setinxml"     message="if:set=setinxml"/&gt;
    &lt;echo unless:set="setinxml" message="unless:set=setinxml"/&gt;
    &lt;echo if:set="notset"       message="if:set=notset"/&gt;
    &lt;echo unless:set="notset"   message="unless:set=notset"/&gt;
    &lt;echo if:set="setincmd"     message="if:set=setincmd"/&gt;
    &lt;echo unless:set="setincmd" message="unless:set=setincmd"/&gt;
&lt;/target&gt;

</project>

And here's the output:

$ ant -version
Apache Ant(TM) version 1.9.2 compiled on July 8 2013
$ ant -Dsetincmd=true
Buildfile: build.xml

build:
     [echo] if:set=setinxml
     [echo] unless:set=notset
     [echo] if:set=setincmd

BUILD SUCCESSFUL
Total time: 0 seconds

The documentation for this, such as it is, is here: If And Unless.