I am now trying to experiment with some of the new features of ant 1.6. Here's
a real-world example of the difficulties of trying to replace antcalls with
macrodefs.
Given the following definitions, notice that I am trying to nest a call to the
macrodef make.precompiled.web.xml inside a call to the macrodef make.se.war.
This is failing because I am trying to use the ATTRIBUTE war.webxml inside the
ELEMENT precompile which contains a call to the nested macrodef
make.precompiled.web.xml.
I could easily fix this by substituting the actual value of the war.webxml
attribute for the ${war.webxml} token. But then I lose the advantage of
defining this in a single place.
Or I can create properties in the macrodef and pass them around, but that feels
wrong too.
Maybe there should be some mechanism for allowing inner macrodefs for
inheriting attributes from an outer macrodef. Maybe elements should be able to
be defined with nested attributes. Or something.
But this experience with trying to use this feature leads me to the feeling
that using the same notation for macrodef attributes and ant properties is not
a good thing. It will definitely cause confusion. At a minimum more
documentation of this is required.
<macrodef name="make.precompiled.web.xml">
<attribute name="src.web.xml"/>
<attribute name="dest.web.xml"/>
<sequential>
<ant antfile="${basedir}/se/build-precomp.xml"
target="create.precompiled.web.xml">
<property name="src.web.xml" value="${src.web.xml}"/>
<property name="dest.web.xml" value="${dest.web.xml}"/>
</ant>
</sequential>
</macrodef>
<macrodef name="make.se.war">
<attribute name="work.dir"/>
<attribute name="war.webxml"/>
<attribute name="war.basedir"/>
<attribute name="war.destfile"/>
<element name="precompile" optional="true"/>
<element name="assemble" optional="false"/>
<element name="additional" optional="true"/>
<sequential>
<delete dir="${work.dir}"/>
<mkdir dir="${work.dir}/temp"/>
<mkdir dir="${work.dir}/war"/>
<precompile/>
<assemble/>
<replace file="${war.webxml}"
token="#build#"
value="${project.version}.${project.maintenance.build}.${project.fix.build}"/>
<war destfile="${war.destfile}"
webxml="${war.webxml}"
basedir="${war.basedir}">
<additional/>
</war>
</sequential>
</macrodef>
<target name="make.admin.war"
depends="make.precompilation"
<make.se.war
work.dir="${dir.admin.ear}"
war.webxml="${dir.build.precomp.webxml}/${admin.web.xml}"
war.basedir="${dir.admin.ear}/temp"
war.destfile="${dir.admin.ear}/war/${admin.war}">
<precompile>
<make.precompiled.web.xml
src.web.xml="${dir.src.web.xmls}/${admin.web.xml}"
dest.web.xml="${war.webxml}"
/>
</precompile>
<assemble>
<copy todir="${war.basedir}">
<fileset dir="${dir.build.war.precomp}"/>
</copy>
</assemble>
</make.se.war>
</target>