DUE TO SPAM, SIGN-UP IS DISABLED. Goto Selfserve wiki signup and request an account.
If you want a version of <ant> with the logical default of inheritall="false", here it is
<presetdef name="better-ant">
<ant inheritall="false"/>
</presetdef>
wherever you use <better-ant>, it will behave exactly like the <ant> task but with a different default value.
You can also define child elements. Say you want all your <javac> tasks to compile against a set of jars living in /our/jar/repository/, you could define
<presetdef name="my-javac">
<javac>
<classpath>
<fileset dir="/our/jar/repository/" includes="*.jar"/>
</classpath>
</javac>
</presetdef>
and use <my-javac> wherever you'd use <javac> instead.
It is interesting to note that both <presetdef> and <macrodef> dynamically define a task that can then be invoked as any other. Properly declared, the resulting tasks can be used interchangeably. Here is a simple example, in which the filter target will echo a message either to the console or to a file depending on whether the property destfile has been set:
<target name="-tocon" unless="destfile">
<macrodef name="myecho">
<attribute name="message" />
<sequential>
<echo taskname="myecho"
message="Echoing a message to the console:" />
<echo taskname="myecho" message="@{message}" />
</sequential>
</macrodef>
</target>
<target name="-tofile" if="destfile">
<presetdef name="myecho">
<echo file="${destfile}" />
</presetdef>
</target>
<target name="filter" depends="-tocon,-tofile">
<loadfile srcFile="${srcfile}" property="message">
<filterchain refid="myfilter" />
</loadfile>
<myecho message="${message}" />
</target>
Another current use for <presetdef> is to provide a work-around for a bug with the JDK 1.5beta1 javac compiler. The compiler accepts target="1.1" but for some reason this does not work unless one sets source="1.3" as well. As this is a temporary issue one does not want to modify the build script much. This can be achieved as follows:
<available property="jdk1.5+" classname="java.util.concurrent.Callable"/>
<target name="check-1.5" if="jdk1.5+">
<presetdef name="javac">
<javac source="1.3"/>
</presetdef>
</target>
<target name="init" depends="check-1.5">
....
</target>
This will make a new javac task which will call the current javac task with the source option set to 1.3. It will also whine that one is overwritting the javac task.