Сборка приложения - Ant

Представленное описание Ant не претендует на всю полноту изложения всех свойств. Основная цель - показать возможности Ant в области копирования и удаления файлов, создания директории и архивов .jar, компиляции простых java-файлов и подключание библиотек .jar.
Ant (с анг. - муравей) - это мощный платформо-независимый скриптовый инструмент для настройки процесса сборки приложений. Ant использует сценарий сборки в виде XML-файла похожий на скрипты "make" при обработке файлов С/С++.
Пример описания сценария сборки:

Сценарий сборки (по-умолчанию файл build.xml) показывает Ant'у что надо делать, чтобы превратить из того, что есть (как правило, исходный java-код) в то, что необходимо. Build файл представляет собой детальный план сборки из частей единого целого, включающий ряд операндов, позволяющих выполнять команды копирования, удаления и перемещения файлов, компиляции java-файлов, формирование документации к коду и JAR-архива, использования репозитория CVS.

Шаблон простейшего сценария

<project name="FirstProject" default="all" basedir=".">
<target name="path">
<property name="srcDir" value="D:\Projects\myProject\src" />
<property name="dstDir" value="D:\Release\myProject" />
<property name="prjDir" value="D:\Projects\myProject" />
</target>
<target name="clean.jar" depends="path">
<echo>Delete all *.jar files</echo>
<delete file="${dstDir}\*.jar" />
</target>
</project>

Согласно представленному сценарию Ant'у необходимо удалить все *.jar файлы из директории D:\Projects\bin.

Сценарий сборки содержит сущность project(проект), включающий несколько сущностей target(задания). Первая строка содержит общую инфомацию о проекте. Самые важные атрибуты элемента project это default (наименование задания по умолчанию) и basedir (базовая директория).
Атрибут basedir указывает на базовую директорию, от которой будут вычисляться относительные пути, используемые в сценарии сборки. Каждый проект может иметь только один атрибут basedir, поэтому можно указывать либо полные пути, либо разбивать сценарий на несколько файлов сборки, в каждом из которых указывать свою базовую директорию. Атрибут default указывает на задание target, определенное для выполнения по-умолчанию.

Ant работает из командной строки поэтому необходимо определить переменную окружения ANT_HOME, указывающую корневую директорию приложения.Для запуска Ant'a на выполнение сценария необходимо правильно описать команду.
Примеры вызова Ant'а для выполнения сценария:

  1. ant -buildfile simple.xml clean.jar
  2. ant -buildfile simple.xml
  3. ant compile
  4. ant
В первом и втором примерах сценарии сборки определены параметром -buildfile и представлены в файле simple.xml. В третьем и четвертом примерах сценарии сборки представлены в файле build.xml, наименование которого используется по-умолчанию.
В первом примере выполняется сценарий clean.jar, в третьем сценарии - compile. Во втором и четвертом примерах Ant выполняет сценарии, определенные по умолчанию.

Создание директории

<target name="make.dir" description="Make a dir" depends="path">
<echo>Make a directory</echo>
<mkdir dir="${dstDir}" \>
</target>

В представленном задании "make.dir" Ant должен создать директорию "D:\Release\myProject", определенную в задании "path" атрибутом "dstDir".

Копирование файлов

<target name="copy" description="Copy ini file" depends="path">
<echo>Copy *.ini files</echo>
<copy todir="${basedir}">
<fileset dir="${prjDir}">
<include name="**/myProject.ini">
</fileset">
</copy">
</target>

Представленный сценарий решает задачу копирования файла myProject.ini из директории проекта prjDir в директорию сборки проекта basedir.
Команда "copy" включает вложенный элемент , который определяет группу файлов. Файлы, которые включаются в эти группы, располагаются в поддиректориях относительно базовой, определенной атрибутом basedir> корневого элемента project. Для файлов может быть указан набор масок (PatternSet), по которым будут отбираться файлы.
PatternSet может быть включен как вложенный элемент в элемент Fileset, и иметь атрибут id по которому можно ссылаться на данный набор из других мест сборки. Например:

<patternset id="sources">
<include name="**/*.java>
<exclude name="**/*test*>
</patternset >

Элементы include и exclude указывает на те маски, результат применения которых следует включать и не включать в набор соответственно.

Формирование .jar файла

Java приложения, как правило, поставляются упакованными в jar файлы. Ant использует специальную команду jar для создания архивов:  
<target name="jar" depends="compile">
<echo>Make jar file</echo>
  <jar destfile="myProject.jar">
  <fileset dir="${dstDir}">
    <include name="**/*.class">
    <exclude name="**/CVS">
  </fileset>
  </jar>
</target>

В представленном задании сценарий формирования файла jar зависит от задания компиляции compile. Упакованный архив в виде файла myProject.jar будет включать все поддиректории с файлами, расположенными в директории dstDir.

Компиляция java-файлов

<target name="common" depends="path">
<echo>Compile common java files</echo>
  <javac srcdir="${srcDir}\common">
   <destdir="${dstDir}"
   <deprecation="off">
   <include name="*.java" />
  </javac>
<target name="compile" depends="path,common">
<echo>Compile sql files</echo>
  <javac srcdir="${srcDir}\sql">
   <destdir="${dstDir}"
   <deprecation="off">
   <classpath="${classpath}">
  </javac>
</target>

Представленные задания сценария сборки решают задачу компиляции java-файлов. Элемент srcDir определяет директорию с файлами исходных кодов. Если java-файлы располагаются в поддиректории, то после фигурных скобок и "слеша" необходимо указать поддиректорию. Элемент destDir определяет директорию назначения. Если в исходных java-файлах указан пакет package, то откомпилированные class-файлы будут располагаться в соответствующих поддиректориях.
Второе задание compile зависит от первого задания common и определено это атрибутом depends, в связи с чем при вызове Ant'а с флагом compile первоначально будет выполнено первое задание.
Для выполнения второго задания, т.е. для компиляции файлов директории taglibs, необходимо использовать дополнительные библиотеки, упакованные в .jar файлы, в связи с чем путь к этим библиотекам указывается в элементе classpath.

Существует 2 особенности задачи компиляции java-файлов javac. Во-первых, можно не указывать непосредственно имена java файлов - достаточно просто указать каталог. Во-вторых, если Ant определит, что class файл существует и новее, чем java файл, то компиляция будет проигнорирована. Эти две особенности являются примерами приемов сборки приложения.

Описание classpath

Ant позволяет определить classpath непосредственно в задании компиляции javac (classpath="extra.jar"), либо отдельно, что удобно при длинном пути, например:

<target name="path">
<property name="srcDir" value="D:\Projects\myProject\src" />
<property name="dstDir" value="D:\Release\myProject" />
<property name="prjDir" value="D:\Projects\myProject" />
<property name="classpath" value="C:\oracle\ora92\jdbc\lib\ojdbc14.jar" />
</target>

Партнеры:

Rambler's Top100 Рейтинг@Mail.ru