Перед прочтением статьи очень рекомендую прочесть большое пособие по ant.
Самый простой способ использовать код несколько раз - это использовать атрибут depends у target-ов. Этот атрибут служит для выстраивания последовательности выполнения таргетов и имеет ряд особенностей:
<target name="init">
<property name="compile.dir" location="C:/output/classes"/>
<mkdir dir="${compile.dir}"/>
<path id="compile_path"/>
</target>
<target name="compile-classes" depends="init">
<javac .... todir="${compile.dir}">
<classpath refid="compile_path"/>
</javac>
</target>
<target name="packaging" depends="init, compile-classes"/>
<target name="deploy" depends="init, compile-classes, packaging"/>
Пример выше показывает, во-первых, переиспользование проперти compile.dir и path-а compile_path, а во-вторых, структуру build.xml, в котором каждый из таргетов compile-classes, packaging и deploy может быть вызван отдельно и независимо.
Второй способ переиспользования кода - это таски ant и antcall. Отличаются они лишь тем, что таск <antcall/> позволяет выполнить таргет из текущего build.xml, а таск <ant/> позволяет запустить абсолютно любой build.xml, находящийся на вашем компьютере. В остальном эти таски одинаковы и имеют следующие особенности:
<target name="delete-subdir">
<delete dir="${super.dir}/classes"/>
<property name="deleted.dir" value="${super.dir}"/>
</target>
<target name="main">
<antcall target="delete-subdir">
<param name="super.dir" value="c:/output1"/>
</antcall>
<echo message="${deleted.dir}"/>
<antcall target="delete-subdir">
<param name="super.dir" value="c:/output2"/>
</antcall>
<echo message="${deleted.dir}"/>
</target>
Этот кусочек кода хорош всем - он удалит директории c:/output1/classes и c:/output2/classes, но вот только проперти deleted.dir проставлено не будет, и таск
<echo message="${deleted.dir}"/> выведет на экран ${deleted.dir} вот прямо со знаком $ и скобочками.
Самый простой способ использовать код несколько раз - это использовать атрибут depends у target-ов. Этот атрибут служит для выстраивания последовательности выполнения таргетов и имеет ряд особенностей:
- Таргет, выполнение которого вызывается атрибутом depends может быть выполнен только до основного таргета
- Если в цепочке depends-ов вызов одного и того же таргета содержится два и более раз, выполняться этот таргет будет всего один раз
- Все проперти и path-like structures, определенные в таргете, вызыванном атрибутом depends, будут доступны из основного таргета
<target name="init">
<property name="compile.dir" location="C:/output/classes"/>
<mkdir dir="${compile.dir}"/>
<path id="compile_path"/>
</target>
<target name="compile-classes" depends="init">
<javac .... todir="${compile.dir}">
<classpath refid="compile_path"/>
</javac>
</target>
<target name="packaging" depends="init, compile-classes"/>
<target name="deploy" depends="init, compile-classes, packaging"/>
Пример выше показывает, во-первых, переиспользование проперти compile.dir и path-а compile_path, а во-вторых, структуру build.xml, в котором каждый из таргетов compile-classes, packaging и deploy может быть вызван отдельно и независимо.
Второй способ переиспользования кода - это таски ant и antcall. Отличаются они лишь тем, что таск <antcall/> позволяет выполнить таргет из текущего build.xml, а таск <ant/> позволяет запустить абсолютно любой build.xml, находящийся на вашем компьютере. В остальном эти таски одинаковы и имеют следующие особенности:
- С помощью них можно вызвать выполнения кода в любом месте таргета, а не только в самом начале
- При вызове таргета с помощью ant/antcall таргету можно передавать проперти, подобно передаче функции её аргументов
- Эти таски "форкают" новый ant-проект, и все проперти и пути, заданные в нём, нам нельзя будет переиспользовать.
<target name="delete-subdir">
<delete dir="${super.dir}/classes"/>
<property name="deleted.dir" value="${super.dir}"/>
</target>
<target name="main">
<antcall target="delete-subdir">
<param name="super.dir" value="c:/output1"/>
</antcall>
<echo message="${deleted.dir}"/>
<antcall target="delete-subdir">
<param name="super.dir" value="c:/output2"/>
</antcall>
<echo message="${deleted.dir}"/>
</target>
Этот кусочек кода хорош всем - он удалит директории c:/output1/classes и c:/output2/classes, но вот только проперти deleted.dir проставлено не будет, и таск
<echo message="${deleted.dir}"/> выведет на экран ${deleted.dir} вот прямо со знаком $ и скобочками.
А что же делать, если надо ко всему прочему, сделать, чтобы проперти сохранялись? В этом нам поможет таск macrodef.
Итак, третий способ переиспользования кода - таск macrodef.
Он очень похож на antcall, только входящие данные в него передаются как атрибуты, а не вложенные параметры, и он новый ant-проект не форкает.
Рассмотрим пример:
<macrodef name="installComponent">
<attribute name="name"/>
<sequential>
<!-- code -->
<peoperty name="@{name}.installed" value="successfull"/>
</sequential>
</macrodef>
<target name="main">
<installComponent name="webComponent"/>
<echo message="${webComponent.installed}"/>
</target>
Этот код выведет на экран сообщение successful.
На этой successful ноте статья кончается.