понедельник, 24 ноября 2008 г.

ANT разборки

ANT разборки
Ant – это инструмент для работы с проектами, в самом широком смысле. С его помощью можно выполнить компиляцию, отладку и тестирование проекта, создавать новые и удалять существующие файлы и папки, создавать архивы с исходными кодами, и многое другое. Полные возможности смотрите в документации, несколько страниц текста.
Сам по себе, Ant выполняет чтение и анализ специального файла (обычно он называется build.xml), который содержит команды для работы с проектом.

Итак, нужно создать файл build.xml (указать имя нужно полностью только если файл называется не build.xml). Как вы уже догадались, театр начинается с вешалки, а проект… верно, с названия:
<project name="Projaeme" default="build" basedir=".">
name – имя проекта;
basedir – имя папки, относительно которой рассчитываются все пути в проекте (точка означает текущую папку);
default – имя задачи, которая будет выполнена по умолчанию.

Свойства в Ant – это аналог переменных в программировании. Каждое свойство имеет два параметра:
name – имя свойства;
location – значение (в данном случае мы указываем название папки).
Пример свойства:
<property name="app_dir" value="web_lab"/>
<property name="build_dir" value="${app_dir}/WEB-INF/classes"/>
Первой строкой мы объявили «переменную» app_dir, во второй строке мы извлекли ее значение. Конструкция извлечения значения выглядит следующим образом: ${PropertyName}. Соответственно в нашем примере возвращается строка web_lab/WEB-INF/classes.

Свойства у нас есть. Теперь перейдем к задачам. Допустим, нам нужно удалить каталог:
<target name="clean">
<delete dir="${build_dir}/example"/>
</target>
Описание каждой задачи должно находиться внутри тега target. Этот тег имеет несколько параметров, но в данном случае мы используем только один – name, который задаёт имя задачи. Тег delete – создает новую директорию example, которая находится в каталоге, имя которого хранится в свойстве build_dir.

Примером другой задачи – может быть задача компиляции:
<target name="compile" depends="init">
<javac srcdir="${src}" destdir="${buildSrc}">
<javac srcdir="${test}" destdir="${buildTest}">
<classpath>
<pathelement path="${ JUnit _path}"></pathelement>
<pathelement path="${buildSrc}"></pathelement>
</classpath>
</javac>
</javac>
</target>
Тег target использует еще один параметр depends, в котором мы указываем имена задач, от которых зависит данная задача. В нашем случае перед компиляцией нужно выполнить инициализацию. Можно писать несколько команд последовательно:
depends="task_1, task_2, task_unknown_task_name"
Тег javac вызывает компилятор офмфс. Его параметры srcdir – директория исходных кодов, и destdir – папка, в которой будут размешены скомпилированные файлы.
Следующий тег javac содержит вложенный тег classpath. В этом теге мы компилируем файлы тестов, которые написаны с помощью JUnit. В первом теге pathelement мы указываем путь до библиотеки JUnit, во втором – указываем какие файлы нам нужно протестировать. Вообще, тег classpath используется, когда нужно указать размещение различных библиотек.
Скомпилированные файлы упаковываем в jar архив:
<target name="dist" depends="compile" description="Create jar-file">
<jar jarfile="${dist}/ProjectName.jar" basedir="${buildSrc}"
manifest="${src}/manifest.mf"/>
</target>
jarfile – имя и размещение jar- файла;
basedir – папка, в которой находится скомпилированная программа;
manifest – размещение и имя манифеста
В манифесте храним параметры, которые будем использовать при запуске программы.
Вот мы создали jar’ик. Теперь нужно его запустить:
<target name="run" depends="dist" description="Run program">
<java jar="${dist}/ProjectName.jar" fork="true"/>
</target>
Запуск программы осуществляет тег java.
jar – указывает на то, что программа запускается из jar архива;
fork="true" – мы запускаем программу на виртуальной машине. Значение true – обязательное требование к загрузке программы из файла.
Далее мы запускаем тесты:
<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.Class1_Test"/>
<test name="tools.utils.Class2_Test"/>
</junit>
</target>

haltonfailure – останавливает выполнение, в случае если тест не проходит;
Теги classpath задают размещение скомпилированных тестов и классов, которые они трестируют;
Тег formatter задает параметры отображения результатов тестирования. Параметр type="plain" указывает, что результаты тестирования должны отображаться в виде обычного текста, а параметр usefile="false" обеспечивает вывод результатов на экран, а не в файл.
Тег test запускает на выполнение, что бы вы думали?
А теперь запустим проект:
Пуск-выполнить-сmd и пишем имя задачи ant taskName. Например ant clean.
Если имя задачи не задано, будет выполнена задача по-умолчанию (та, что задана в параметре default тега project).

В принципе, это все, о чем я хотел рассказать.

PS если хотите в чем то разобраться – пишите в блог. Что вам непонятно, что понятно, как вы это делали. Я, например, до написания этого дела считал ANT чем то из разряда редкого китайского диалекта в кодировке KOI-8. Удачи!
PPS за код сильно не бить, так как в данном тексте есть как честно выдернутый из примеров код, так и самопиный.

6 комментариев:

tpumapa3m комментирует...

http://www.intensedebate.com/ вот тебе чудо-хрень для блога, пример работы у голодного. Мля китайский диалект кои-8. Как у тебя возникла эта идея?

KC комментирует...

Идея чего? Диалекта? :)
Раз в блоге писать не о чем, а меня так ненавящщиво назвали ламером, то, думаю, стоит написать о программировании хотя бы в том плане что "о, я что то понял!".

KC комментирует...

Вобще я не претендую что это дело какое то практическое руководство. Это скорее для того, чтобы для себя определить зачем и как использовать ANT при написании программ. конечно, в наших лабах он бесполезен по большому счету, но на будущее будет полезно.

chidori комментирует...

"Тег delete – создает новую директорию"
Тут я короче фф шоке был )) ибо тег delete не думаю что будет создавать директорию )) поправь плиз ))

итак...
Общий отзыв: круть!! молодцом, что расписал это ))
Я бы немного по-другому рассказывал, но в целом это обалденно пригодиться нашим ИрГТУшным программерам ~^_^~

KC комментирует...

На самом деле сначала я скачал примерчик один. там был странный файлик. на кой он черт - хз. отсюда и начал разбираться. писал сам мало, в основном склеил из того что было.

chidori комментирует...

склеивать грамотно тоже надо уметь, поэтому и говорит что жеюниты там не стоило описывать ))