Топ контрибуторов
loading
loading
Знаете ли Вы, что

Свои вопросы для тестов можно добавлять на странице с информацией о тесте. При этом для некоторых тестов добавление вопросов закрыто

Лента обновлений
ссылка 10:48:32
Комментарий от Petia_radivon:
Прекрасный тест. Узнал много чего нового . Спасибо...
ссылка 00:12:51
Комментарий от ilia:
Вопрос устарел: "Deprecated since version 3.0.0: db.collect...
ссылка 00:07:31
Комментарий от ilia:
Вопрос в текущей формулировке некорректен, так как write lo...
ссылка Dec 8 23:42
Комментарий от ilia:
Я тоже не в вижу в документации, что можно использовать кав...
ссылка Dec 8 13:11
Комментарий от Desperando1:
на самом деле очень много легаси с xml конфигами :)
...
Статистика

Тестов: 153, вопросов: 8596. Пройдено: 446965 / 2193843.

О многократном использовании кода в Apache Ant

head tail Статья
категория
Java Tools
дата16.06.2010
авторSkvorec
голосов4
Перед прочтением статьи очень рекомендую прочесть большое пособие по ant.

Самый простой способ использовать код несколько раз - это использовать атрибут depends у target-ов. Этот атрибут служит для выстраивания последовательности выполнения таргетов и имеет ряд особенностей:

  1. Таргет, выполнение которого вызывается атрибутом depends может быть выполнен только до основного таргета
  2. Если в цепочке depends-ов вызов одного и того же таргета содержится два и более раз, выполняться этот таргет будет всего один раз
  3. Все проперти и path-like structures, определенные в таргете, вызыванном атрибутом depends, будут доступны из основного таргета
Эти три особенности делают атрибут depends незаменимым при построении зависимостей между таргетами. Для примера рассмотрим следующий кусочек build.xml:

<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, находящийся на вашем компьютере. В остальном эти таски одинаковы и имеют следующие особенности:

  1. С помощью них можно вызвать выполнения кода в любом месте таргета, а не только в самом начале
  2. При вызове таргета с помощью ant/antcall таргету можно передавать проперти, подобно передаче функции её аргументов
  3. Эти таски "форкают" новый 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} вот прямо со знаком $ и скобочками.

А что же делать, если надо ко всему прочему, сделать, чтобы проперти сохранялись? В этом нам поможет таск 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 ноте статья кончается.

Если Вам понравилась статья, проголосуйте за нее

Голосов: 4  loading...
art   Skvorec   yohan   coldy