Создание простейшего build-файла

Build-файлы Ant пишутся на языке XML. Каждый build-файл содержит один проект (project) и хотя бы одну цель (target). Цель содержит задачи (tasks). Каждая задача, встречающаяся в build-файле, может иметь id атрибут и может быть позже вызвана по нему. Идентификаторы должны быть уникальными.Используемые теги:ProjectТег Project имеет три атрибута:
Атрибут Описание Обязательность
name Имя проекта Нет
default Цель по умолчанию, которая будет использоваться, если явно не указанно, какую цель выполнять Да
basedir Основная директория, из которой будут выходить все пути, использующиеся при работе (если она не указана, то будет использоваться текущая директория, в которой находится build-файл) Нет
Каждый проект содержит одну или несколько целей. Цель представляет собой набор задач, которые необходимо выполнить. При запуске Ant можно выбрать цель, которую(ые) следует выполнить. Если цель не указывать, будет выполнена установленная по умолчанию.

Targets

Цель может зависеть от других целей. Например, имеются две цели: для компиляции и для изъятия файлов с базы данных. Соответственно скомпилировать файлы можно только после того, как они будут извлечены. Ant учитывает такие зависимости.Следует отметить, что depends-атрибут Ant только обозначает порядок,
в котором цели должны быть выполнены. Ant пробует выполнить цели в порядке, соответствующем порядку их появления в атрибутеdepends (слева направо).<target name="A"/><target name="B" depends="A"/><target name="C" depends="B"/><target name="D" depends="C,B,A"/>Пусть нужно выполнить цель D. Из её атрибутаdepends можно узнать, что первой выполнится цель C, затем B и, наконец, A. Неверно: C зависит от B, a B зависит от A, таким образом, первой выполнится цель A, затем B, потом C, а после D.Цель будет исполнена только один раз, даже если более чем одна цель зависит от неё.Цель также имеет возможность быть исполненной только в случае, если определённый параметр (property) был (или не был) установлен. Это позволяет лучше контролировать процесс сборки (например, в зависимости от операционной системы, версии Java и т.д.). Ant только проверяет, установлено ли то либо иное свойство, значение его не важно. Свойство, значением которого является пустая строка, считается заполненным. Например:<target name="build-module-A" if="module-A-present"/><target name="build-own-fake-module-A" unless= "module-A-present"/>Если не установлены if и unless атрибуты, цель будет выполняться всегда.Опциональный атрибутdescription может быть использован как описание цели и будет выводиться при команде– projecthelp.Target имеет следующие атрибуты:
Атрибут Описание Обязательность
name Имя цели Да
depends Разделённый запятыми список имён целей, от которых эта цель зависит Нет
if Имя параметра, который должен быть установлен, чтобы эта цель выполнялась Нет
unless Имя параметра, который не должен быть установлен, чтобы эта цель выполнялась Нет
description Небольшое описание функции function цели Нет
Имя цели должно состоять только из букв и цифр, включая пустую строку "", "," и пробел.Пример build-файла:

<?xml version='1.0' encoding='ISO-8859-1'?>

<project name="MyProject" default="dist" basedir=".">

<description>

Простой пример build файла

</description>

<!-- установка глобальных параметров -->

<property name="src" location="src"/>

<property name="build" location="build"/>

<property name="dist" location="dist"/>

<target name="init">

<!-- Создать марку времени -->

<tstamp/>

<!-- Создать структуру build директории, которая будет использоваться при компиляции-->

<mkdir dir="${build}"/>

</target>

<target name="compile" depends="init"

description="compile the source " >

<!-- Компиляция java кода из ${src} в ${build} -->

<javac srcdir="${src}" destdir="${build}"/>

</target>

<target name="dist" depends="compile"

description="генерация дистрибутива" >

<!-- создание директории для дистрибутива -->

<mkdir dir="${dist}/lib"/>

<!-- Положить всё из ${build} в MyProject-${DSTAMP}.jar файл -->

<jar jarfile="${dist}/lib/MyProject-${DSTAMP}.jar" basedir="${build}"/>

</target>

<target name="clean"

description="очищает рабочие каталоги" >

<!-- Delete the ${build} and ${dist} directory trees -->

<delete dir="${build}"/>

<delete dir="${dist}"/>

</target>

</project>

Некоторым целям было дано описание. Это значит, что командой projecthelp будет получен список этих целей с описанием; остальные цели считаются внутренними и не выводятся.

Чтобы всё работало, исходные коды в src поддиректории должны располагаться в соответствии с именами ихpackage.

Пример результата выполнения:

D:\tmp\1>ant

Buildfile: build.xml

init:

[mkdir] Created dir: D:\tmp\1\build

compile:

[javac] Compiling 1 source file to D:\tmp\1\build

dist:

[mkdir] Created dir: D:\tmp\1\dist\lib

[jar] Building jar: D:\tmp\1\dist\lib\MyProject-20070815.jar

BUILD SUCCESSFUL

Total time: 3 seconds

Property

Свойства в Ant аналогичны переменным в языках программирования тем, что имеют имя и значение. Однако, в отличие от обычных переменных, свойства
в Ant не могут быть изменены после их установки: они постоянны.

<property name=“path” value=“./project”/>

Для обращения к этому свойству в остальных местах нашего файла компоновки можно было бы использовать следующий синтаксис:

${path}

Например:

<property name=“libpath" value="${path}/lib"/>

Ant также позволяет установить переменные в отдельном property-файле. Пример property-файла:

#

# A sample “ant.properties” file

#

month=30 days

year=2004

и его использования

<?xml version="1.0"?>

<project name=“test.properties" default="all" >

<property file=“ant.properties"/>

<target name="all" description="Uses properties">

<echo>This month is ${month}</echo>

<echo>This year is ${year}</echo>

</target>

</project>

Шаблоны

Часто является полезным выполнить эти операции с группой файлов сразу, например, со всеми файлами в указанном каталоге с названиями, заканчивающимися на .java, но не начинающимися с EJB. Пример копирования таких файлов:

<copy todir="archive">

<fileset dir="src">

<include name="*.java"/>

<exclude name= "EJB*.java“/>

</fileset>

</copy>

Filter

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

<filterset id="copy.filterset">

<filter token="version" value="1.1"/>

</filterset>

<target name=”copy”>

<copy file="file1.txt" tofile="file2.txt" filtering="true">

<filterset refid="copy.filterset" />

</copy>

</target>

Содержимое исходного текстового файла:

# file.txt

Version is @version@

В результате получаем:

# file.txt

Version is 1.1

Path-like структуры

Можно определить типы ссылокpath и classpath, используя как ":" (unix-style) так и ";" (windows-style) как разделитель символов. Ant скорректирует их в требуемые текущей операционной системой.

В случае, когда path-like значение надо определить, могут использоваться подсоединяемые элементы (nested elements). Это выглядит примерно так:

<classpath> <pathelement path="${classpath}"/> <pathelement location="lib/helper.jar"/> </classpath>

Атрибут location определяет отдельный файл или директорию, в то время как атрибут path принимает список из locations. Атрибут path должен использоваться с только с определённым ранее путём.

В качестве сокращения <classpath> поддерживает path и locationатрибуты так:

<classpath> <pathelement path="${classpath}"/> </classpath>

Может быть сокращено до:

<classpath path="${classpath}"/>

В дополнение DirSets, FileSets и FileLists могут быть использованы как внутренние:

<classpath> <pathelement path="${classpath}"/> <fileset dir="lib"> <include name="**/*.jar"/> </fileset> <pathelement location="classes"/> <dirset dir="${build.dir}"> <include name="apps/**/classes"/> <exclude name="apps/**/*Test*"/> </dirset> <filelist refid="third-party_jars"/> </classpath>

Path-likeструктуры могут содержать ссылки на другие path-like структуры с помощью <path> элемента:

<path id="base.path"> <pathelement path="${classpath}"/> <fileset dir="lib"> <include name="**/*.jar"/> </fileset> <pathelement location="classes"/> </path> <path id="tests.path"> <path refid="base.path"/> <pathelement location="testclasses"/> </path>

Опции командной строки

Запускать Ant на исполнение той или иной задачи очень просто:

ant [options] [target [target2 [target3] ...]]

Options

Наши рекомендации