Внимание! Это сайт переехал на www.simplecoding.org
Вступление, или несколько слов о том, зачем это надо
Устанавливаем Ant, и разрабатываем структуру проекта
Создаем файл build.xml, и учимся им пользоваться
Скачать архив с файлами проекта
Заключение
Теперь нам нужно создать файл build.xml (вообще-то название может быть любое, но тогда при вызове Ant его придется указывать явно). Как вы уже, наверное, догадались, этот файл имеет xml формат, информации о котором более чем достаточно в Internet. Но глубокие знания этого формата в данном случае не нужны. В документации для каждой задачи приводится необходимый xml- фрагмент с описанием параметров. Вам остается только вставить свои значения параметров.
Любой xml- документ начинается со строки:
<?xml version="1.0" encoding="windows-1251"?>
в которой указываются номер версии xml и кодировка, которая используется в файле.
Все задачи, описанные в build- файле должны находится внутри тега
<project name="myProject" basedir="." default="run"> . . . </project>
который, в нашем случае, имеет 3 параметра:
name – имя проекта;
basedir – имя папки, относительно которой рассчитываются все пути в
проекте (точка означает текущую папку);
default – имя задачи, которая будет выполнена по умолчанию.
Теперь перейдем непосредственно к написанию задач. Но, прежде всего, создадим несколько свойств.
<property name="src" location="src"/> <property name="buildSrc" location="build/classes"/> <property name="buildTest" location="build/tests"/> <property name="dist" location="dist"/> <property name="test" location="test"/>
Свойства в Ant – это аналог переменных в программировании. Каждое свойство имеет два параметра:
name – имя свойства;
location – значение (в данном случае мы указываем название папки).
Использовать свойства очень просто, для этого нужно имя свойства написать между символами
${ и }.
Например, выражение:
myProject/${buildTest} будет преобразовано в
myProject/build/classes.
Итак, свойства у нас есть, теперь перейдем к созданию задач.
В первую очередь нам нужна задача, которая создает папки build/classes, build/tests и
dist. Назовем её init (инициализация).
<target name="init"> <mkdir dir="${buildSrc}"/> <mkdir dir="${buildTest}"/> <mkdir dir="${dist}"/> </target>
Описание каждой задачи должно находиться внутри тега target. Этот тег
имеет несколько параметров, но в данном случае мы используем только один – name,
который задает имя задачи.
Тег mkdir – создает папку, а его параметр
dir – указывает какую именно.
Следующая задача compile.
<target name="compile" depends="init"> <javac srcdir="${src}" destdir="${buildSrc}"/> <javac srcdir="${test}" destdir="${buildTest}"> <classpath> <pathelement path="C:/junit3.8.1/junit.jar"/> <pathelement path="${buildSrc}"/> </classpath> </javac> </target>
Здесь появляется ещё один параметр тега target,
depends, в котором мы указываем имена задач, от которых зависит
данная задача. То есть, в данном случае, при вызове задачи compile
сначала будет выполнена задача init. Можно указать любое количество
задач, от которых зависит данная, например: depends="init, task1, task2".
Следующим у нас идет тег javac. Как не трудно догадаться он вызывает
компилятор javac. С параметрами тоже все просто.
srcdir – папка, в которой находятся исходники (т.е. файлы с расширением
java), destdir – папка, в которой будут размешены скомпилированные
файлы (т.е. файлы с расширением class).
В следующей строке у нас опять тег javac, но теперь он имеет вложенный
тег classpath. Зачем он нужен? В этом теге мы компилируем файлы тестов,
которые написаны с использованием библиотеки JUnit (её описание можно
почитать на сайте www.junit.org). Естественно нам нужно указать
размещение этой библиотеки, что мы и делаем в теге pathelement, который
является вложенным в тег classpath. В параметре
path мы указываем размещение библиотеки. Во втором теге
pathelement мы указываем путь к файлам, которые нужно протестировать.
Вообще, тег classpath используется, когда нужно указать размещение
различных библиотек.
Сейчас у нас уже есть скомпилированные файлы, и нам нужно упаковать их в jar- архив. Следующая наша задача как раз для этого и предназначена.
<target name="dist" depends="compile" description="Create jar-file"> <jar jarfile="${dist}/myProject.jar" basedir="${buildSrc}" manifest="${src}/manifest.mf"/> </target>
Тут в теге target мы использовали еще один параметр description. Этот параметр не обязательный, он просто задает описание задачи.
Упаковку файлов в архив выполняет тег jar, в котором мы задаем три параметра:
jarfile – имя и размещение jar- файла, который мы хотим создать;
basedir – папка в которой находится скомпилированная программа;
manifest – размещение и имя манифеста (напомню, в этом файле можно задать
ряд параметров, которые использоваться при запуске программы из jar- архива).
Теперь напишем задачу для запуска только что созданного jar- файла.
<target name="run" depends="dist" description="Run program"> <java jar="${dist}/myProject.jar" fork="true"/> </target>
Обратите внимание, тут параметр depends имеет значение dist, потому что пока архив не создан, нам нечего запускать. Запуск программы осуществляет тег java (кто бы мог подумать:-)). Его параметр jar указывает, что мы хотим запустить программу из jar- архива. Параметр fork имеет значение true, это означает, что для запуска программы мы используем отдельную виртуальную машину (обязательное требование при запуске из jar- файла).
Следующая задача запускает наши тесты (действительно, мы же их зачем-то написали).
<target name="test" depends="compile"> <junit fork="yes" haltonfailure="yes"> <classpath> <pathelement location="${buildTest}"/> <pathelement location="${buildSrc}"/> </classpath> <formatter type="plain" usefile="false" /> <test name="tools.utils.Class1Test"/> <test name="tools.utils.Class2Test"/> </junit> </target>
Внимание. Для того, чтобы работала эта задача нам нужно рассказать Ant где находится библиотека junit.jar. В документации к Ant описывается три различных способа, которые позволяют это сделать. Я использовал самый простой: скопировал файл junit.jar в папку ANT_HOME/lib.
Тестирование выполняется в теге junit, который имеет два параметра:
fork – запускает тесты в отдельной виртуальной машине;
haltonfailure – останавливает выполнение, в случае если тест не проходит.
Теги classpath задают размещение скомпилированных тестов и классов,
которые они трестируют.
Тег formatter задает параметры отображения результатов тестирования.
Параметр type="plain" указывает, что результаты тестирования должны
отображаться в виде обычного текста, а параметр usefile="false"
обеспечивает вывод результатов на экран, а не в файл.
С помощью тегов test мы запускаем наши тесты. С помощью параметра
name мы указываем название теста.
Так, программу мы протестировали, теперь подготовим её исходный код к размещению в Internet. Для этого, упакуем его в обычный zip архив.
<target name="packSrc"> <zip destfile="myProject_Src.zip"> <fileset dir="." includes="**/*.java, **/*.mf, **/*.xml"/> </zip> </target>
Создание архива выполняется с помощью тега zip. С помощью параметра destfile задаем имя архива. А вложенный тег fileset позволяет указать перечень файлов, которые войдут в архив. Тут нужны некоторые пояснения. Во-первых, в архив нам нужно включить только те файлы, которые мы создали сами, а именно: файлы с расширениями java, mf, xml. Во-вторых, поиск файлов, которые нужно включить в проект, мы начинаем с папки myProject. Для этого мы используем параметры dir и includes. dir – задает стартовую папку, includes – указывает шаблоны выбора файлов в архив ("**" - означают любую папку, "*" - любое количество любых символов в имени файла).
И, наконец, наша последняя задача – clean. С её помощью мы можем удалить результаты работы всех предыдущих задач (останутся только исходники).
<target name="clean"> <delete dir="build"/> <delete dir="${dist}"/> <delete file="myProject_Src.zip"/> </target>
Тут все просто. Мы используем тег delete для удаления папки и её
содержимого. Параметр dir задает имя папки. В последнем теге
параметр file задает имя файла.
Обратите внимание, в первом теге delete мы указываем имя папки явно
(не используя параметры), что позволяет за один раз удалить папки build/classes и
build/tests.
Ладно, задачи мы написали. Теперь разберемся как ими пользоваться. Для этого открываем консоль
(в Windows: Пуск->Выполнить… cmd). Переходим в папку с проектом (тут же находится наш файл
build.xml), и пишем команду
ant <имя_задачи>
Например: ant compile
ant clean и т.д.
Если имя задачи не задано, будет выполнена задача по-умолчанию (та, что задана в параметре
default тега project), в нашем случае
run.
Теперь посмотрим весь файл целиком.
<?xml version="1.0" encoding="windows-1251"?> <project name="myProject" basedir="." default="run"> <!--Устанавливаем глобальные свойства для данного проекта--> <property name="src" location="src"/> <property name="buildSrc" location="build/classes"/> <property name="buildTest" location="build/tests"/> <property name="dist" location="dist"/> <property name="test" location="test"/> <!--Эта задача создает папки для размещения скомпилированных исходников и дистрибутива--> <target name="init"> <mkdir dir="${buildSrc}"/> <mkdir dir="${buildTest}"/> <mkdir dir="${dist}"/> </target> <!--Эта задача выполняет компиляцию проекта--> <target name="compile" depends="init"> <javac srcdir="${src}" destdir="${buildSrc}"/> <javac srcdir="${test}" destdir="${buildTest}"> <classpath> <pathelement path="C:/junit3.8.1/junit.jar"/> <pathelement path="${buildSrc}"/> </classpath> </javac> </target> <!-- Эта задача упаковывает программу в jar-архив --> <target name="dist" depends="compile" description="Create jar-file"> <jar jarfile="${dist}/myProject.jar" basedir="${buildSrc}" manifest="${src}/manifest.mf"/> </target> <!-- Эта задача запускает программу --> <target name="run" depends="dist" description="Run program"> <java jar="${dist}/myProject.jar" fork="true"/> </target> <!-- Эта задача упаковывает файлы с исходными кодами и ресурсами в zip-архив --> <target name="packSrc"> <zip destfile="myProject_Src.zip"> <fileset dir="." includes="**/*.java, **/*.mf, **/*.xml"/> </zip> </target> <!-- Эта задача выполняет тестирование проекта --> <target name="test" depends="compile"> <junit fork="yes" haltonfailure="yes"> <classpath> <pathelement location="${buildTest}"/> <pathelement location="${buildSrc}"/> </classpath> <formatter type="plain" usefile="false" /> <test name="tools.utils.Class1Test"/> <test name="tools.utils.Class2Test"/> </junit> </target> <!-- Эта задача удаляет все, кроме исходников --> <target name="clean"> <delete dir="build"/> <delete dir="${dist}"/> <delete file="myProject_Src.zip"/> </target> </project>
И ничего сложного.
Если хотите, можете скачать архив со всеми файлами проекта.