]]>
ваш баннер
]]>

Настройка и использование Apache Ant для разработки Java приложений

17 августа, 2007

Вступление, или несколько слов о том, зачем это надо
Устанавливаем Ant, и разрабатываем структуру проекта
Создаем файл build.xml, и учимся им пользоваться
Скачать архив с файлами проекта
Заключение

Теперь нам нужно создать файл build.xml (вообще-то название может быть любое, но тогда при вызове Ant его придётся указывать явно). Как вы уже, наверное, догадались, этот файл имеет xml формат, информации о котором более чем достаточно в Internet. Но глубокие знания этого формата в данном случае не нужны. В документации для каждой задачи приводится необходимый xml- фрагмент с описанием параметров. Вам остаётся только вставить свои значения параметров.

Любой xml- документ начинается со строки:

Code (xml)
  1. <?xml version="1.0" encoding="windows-1251"?>

в которой указываются номер версии xml и кодировка, которая используется в файле.
Все задачи, описанные в build- файле должны находится внутри тега

Code (xml)
  1. <project name="myProject" basedir="." default="run"> . . . </project>

который, в нашем случае, имеет 3 параметра:
name – имя проекта;
basedir – имя папки, относительно которой рассчитываются все пути в проекте (точка означает текущую папку);
default – имя задачи, которая будет выполнена по умолчанию.

Теперь перейдём непосредственно к написанию задач. Но, прежде всего, создадим несколько свойств.

Code (xml)
  1. <property name="src" location="src"/>
  2. <property name="buildSrc" location="build/classes"/>
  3. <property name="buildTest" location="build/tests"/>
  4. <property name="dist" location="dist"/>
  5. <property name="test" location="test"/>

Свойства в Ant – это аналог переменных в программировании. Каждое свойство имеет два параметра:
name – имя свойства;
location – значение (в данном случае мы указываем название папки).
Использовать свойства очень просто, для этого нужно имя свойства написать между символами ${ и }.
Например, выражение:
myProject/${buildTest} будет преобразовано в myProject/build/classes.

Итак, свойства у нас есть, теперь перейдём к созданию задач.
В первую очередь нам нужна задача, которая создаёт папки build/classes, build/tests и dist. Назовём её init (инициализация).

Code (xml)
  1. <target name="init">
  2.     <mkdir dir="${buildSrc}"/>
  3.     <mkdir dir="${buildTest}"/>
  4.     <mkdir dir="${dist}"/>
  5. </target>

Описание каждой задачи должно находиться внутри тега target. Этот тег имеет несколько параметров, но в данном случае мы используем только один – name, который задаёт имя задачи.
Тег mkdir – создаёт папку, а его параметр dir – указывает какую именно.

Следующая задача compile.

Code (xml)
  1. <target name="compile" depends="init">
  2.     <javac srcdir="${src}" destdir="${buildSrc}">
  3.     <javac srcdir="${test}" destdir="${buildTest}">
  4.         <classpath>
  5.             <pathelement path="C:/junit3.8.1/junit.jar"></pathelement>
  6.             <pathelement path="${buildSrc}"></pathelement>
  7.         </classpath>
  8.     </javac>
  9.     </javac>
  10. </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- архив. Следующая наша задача как раз для этого и предназначена.

Code (xml)
  1. <target name="dist" depends="compile" description="Create jar-file">
  2.     <jar jarfile="${dist}/myProject.jar" basedir="${buildSrc}"
  3.         manifest="${src}/manifest.mf"/>
  4. </target>

Тут в теге target мы использовали еще один параметр description. Этот параметр не обязательный, он просто задает описание задачи.

Упаковку файлов в архив выполняет тег jar, в котором мы задаем три параметра:
jarfile – имя и размещение jar- файла, который мы хотим создать;
basedir – папка в которой находится скомпилированная программа;
manifest – размещение и имя манифеста (напомню, в этом файле можно задать ряд параметров, которые использоваться при запуске программы из jar- архива).

Теперь напишем задачу для запуска только что созданного jar- файла.

Code (xml)
  1. <target name="run" depends="dist" description="Run program">
  2.     <java jar="${dist}/myProject.jar" fork="true"/>
  3. </target>
  4.  
  5. Обратите внимание, тут параметр depends имеет значение dist, потому что пока архив не создан, нам нечего запускать. Запуск программы осуществляет тег <code>java</code> (кто бы мог подумать:-)). Его параметр jar указывает, что мы хотим запустить программу из jar- архива. Параметр fork имеет значение true, это означает, что для запуска программы мы используем отдельную виртуальную машину (обязательное требование при запуске из jar- файла).
  6.  
  7. Следующая задача запускает наши тесты (действительно, мы же их зачем-то написали).
  8. <pre lang="xml"><target name="test" depends="compile">
  9.     <junit fork="yes" haltonfailure="yes">
  10.         <classpath>
  11.             <pathelement location="${buildTest}"/>
  12.             <pathelement location="${buildSrc}"/>
  13.         </classpath>
  14.     <formatter type="plain" usefile="false" />
  15.     <test name="tools.utils.Class1Test"/>
  16.     <test name="tools.utils.Class2Test"/>
  17.     </junit>
  18. </target>

Внимание. Для того, чтобы работала эта задача нам нужно рассказать Ant где находится библиотека junit.jar. В документации к Ant описывается три различных способа, которые позволяют это сделать. Я использовал самый простой: скопировал файл junit.jar в папку ANT_HOME/lib.Тестирование выполняется в теге junit, который имеет два параметра:

fork – запускает тесты в отдельной виртуальной машине;

haltonfailure – останавливает выполнение, в случае если тест не проходит.

Теги classpath задают размещение скомпилированных тестов и классов, которые они трестируют.

Тег formatter задает параметры отображения результатов тестирования. Параметр type="plain" указывает, что результаты тестирования должны отображаться в виде обычного текста, а параметр usefile="false" обеспечивает вывод результатов на экран, а не в файл.

С помощью тегов test мы запускаем наши тесты. С помощью параметра name мы указываем название теста.Так, программу мы протестировали, теперь подготовим её исходный код к размещению в Internet. Для этого, упакуем его в обычный zip архив.

Code (xml)
  1. <target name="packSrc">
  2.     <zip destfile="myProject_Src.zip">
  3.         <fileset dir="." includes="**/*.java, **/*.mf,
  4.             **/*.xml"/>
  5.     </zip>
  6. </target>

Создание архива выполняется с помощью тега zip. С помощью параметра destfile задаем имя архива. А вложенный тег fileset позволяет указать перечень файлов, которые войдут в архив. Тут нужны некоторые пояснения. Во-первых, в архив нам нужно включить только те файлы, которые мы создали сами, а именно: файлы с расширениями java, mf, xml. Во-вторых, поиск файлов, которые нужно включить в проект, мы начинаем с папки myProject. Для этого мы используем параметры dir и includes. dir – задает стартовую папку, includes – указывает шаблоны выбора файлов в архив (”**” - означают любую папку, “*” - любое количество любых символов в имени файла).
И, наконец, наша последняя задача – clean. С её помощью мы можем удалить результаты работы всех предыдущих задач (останутся только исходники).

Code (xml)
  1. <target name="clean">
  2.     <delete dir="build"/>
  3.     <delete dir="${dist}"/>
  4.     <delete file="myProject_Src.zip"/>
  5. </target>

Тут все просто. Мы используем тег delete для удаления папки и её содержимого. Параметр dir задает имя папки. В последнем теге параметр file задает имя файла.

Обратите внимание, в первом теге delete мы указываем имя папки явно (не используя параметры), что позволяет за один раз удалить папки build/classes и build/tests.
Ладно, задачи мы написали. Теперь разберемся как ими пользоваться. Для этого открываем консоль

(в Windows: Пуск->Выполнить… cmd). Переходим в папку с проектом (тут же находится наш файл build.xml), и пишем команду
ant <имя_задачи>
Например: ant compile, ant clean и т.д.

Если имя задачи не задано, будет выполнена задача по-умолчанию (та, что задана в параметре default тега project), в нашем случае run.
Теперь посмотрим весь файл целиком.

Code (xml)
  1. <?xml version="1.0" encoding="windows-1251"?>
  2.  
  3. <project name="myProject" basedir="." default="run">
  4.     <!–Устанавливаем глобальные свойства для данного проекта–>
  5.     <property name="src" location="src"/>
  6.     <property name="buildSrc" location="build/classes"/>
  7.     <property name="buildTest" location="build/tests"/>
  8.     <property name="dist"  location="dist"/>
  9.     <property name="test" location="test"/>
  10.  
  11.     <!–Эта задача создает папки для размещения скомпилированных
  12.         исходников и дистрибутива–>
  13.     <target name="init">
  14.         <mkdir dir="${buildSrc}"/>
  15.         <mkdir dir="${buildTest}"/>
  16.         <mkdir dir="${dist}"/>
  17.     </target>
  18.  
  19.     <!–Эта задача выполняет компиляцию проекта–>
  20.     <target name="compile" depends="init">
  21.         <javac srcdir="${src}" destdir="${buildSrc}"/>
  22.         <javac srcdir="${test}" destdir="${buildTest}">
  23.             <classpath>
  24.                 <pathelement path="C:/junit3.8.1/junit.jar"/>
  25.                 <pathelement path="${buildSrc}"/>
  26.             </classpath>
  27.         </javac>
  28.     </target>
  29.  
  30.     <!– Эта задача упаковывает программу в jar-архив –>
  31.     <target name="dist" depends="compile" description="Create jar-file">
  32.         <jar jarfile="${dist}/myProject.jar" basedir="${buildSrc}"
  33.             manifest="${src}/manifest.mf"/>
  34.     </target>
  35.  
  36.     <!– Эта задача запускает программу –>
  37.     <target name="run" depends="dist" description="Run program">
  38.         <java jar="${dist}/myProject.jar" fork="true"/>
  39.     </target>
  40.  
  41.     <!– Эта задача упаковывает файлы с исходными кодами и ресурсами
  42.         в zip-архив –>
  43.     <target name="packSrc">
  44.         <zip destfile="myProject_Src.zip">
  45.             <fileset dir="." includes="**/*.java, **/*.mf, **/*.xml"/>
  46.         </zip>
  47.     </target>
  48.  
  49.     <!– Эта задача выполняет тестирование проекта –>
  50.     <target name="test" depends="compile">
  51.         <junit fork="yes" haltonfailure="yes">
  52.             <classpath>
  53.                 <pathelement location="${buildTest}"/>
  54.                 <pathelement location="${buildSrc}"/>
  55.             </classpath>
  56.             <formatter type="plain" usefile="false" />
  57.             <test name="tools.utils.Class1Test"/>
  58.             <test name="tools.utils.Class2Test"/>
  59.         </junit>
  60.     </target>
  61.  
  62.     <!– Эта задача удаляет все, кроме исходников –>
  63.     <target name="clean">
  64.         <delete dir="build"/>
  65.         <delete dir="${dist}"/>
  66.         <delete file="myProject_Src.zip"/>
  67.     </target>
  68. </project>

Скачать архив с файлами проекта

И ничего сложного. Если хотите, можете скачать архив со всеми файлами проекта.

Страницы: 1 2 3 4

Понравилась статья? Подпишитесь на продолжение rss link !

]]>

Добавьте эту страницу в google.com bobrdobr.ru del.icio.us technorati.com linkstore.ru news2.ru rumarkz.ru memori.ru moemesto.ru

]]>

Опубликовано в Java

]]>

Один комментарий

Вы можете отслеживать обсуждение записи с помощью RSS 2.0 rss link

Вы также можете оставить комментарий, или трекбек с Вашего сайта.

  1. Анатолий 10.12.2007 в 01:57 (Ответить)

    Хорошая статья. респект

Оставить комментарий

Введите ваш комментарий

* - обязательные для заполнения поля

Quicktags:

]]>