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