[Из песочницы] Apache Ant – быстрый старт
Мы пройдём пять простых шагов, чтобы начать использовать Ant:
- Скачаем, установим и настроим.
- Разберёмся с принципами работы и форматом XML-сценария сборки.
- Узнаем минимально необходимый список заданий.
- Напишем простейший Ant-сценарий.
- Напишем сценарий для полного цикла сборки и тестирования простого проекта.
Нам потребуется Java SE Development Kit (JDK, скачиваем тут), ваш любимый текстовый редактор (для Windows рекомендую Notepad++) и минимальные навыки работы в командной строке. Сценарии сборки и пример на Java протестированы и в Windows (XP/7), и в Linux (Xubuntu 12.04, CentOS 6.8). Однако в дальнейшем мы будем предполагать что работаем в Windows.
1. Скачиваем, устанавливаем, настраиваем
Посещаем веб-сайт ant.apache.org заходим в раздел Download/Binary Distributions и скачиваем файл apache-ant-1.10.1-bin.zip (возможно сейчас есть уже более свежая версия). Содержимое архива копируем в любой каталог, например «C:\Program Files\Ant» (Windows). Затем добавляем путь к каталогу bin (C:\Program Files\Ant\bin) в системную переменную Path.
Проверяем работоспособность Ant, вызвав командную строку:
C:\>ant -version
Apache Ant™ version 1.10.1 compiled on February 2 2017
Если аналогичное сообщение получено — всё в порядке.
2. Основные принципы работы
Сценарий сборки — обычный XML-файл. Он содержит определение целей (target), зависимостей (depends) и свойств (property). Простейший сценарий должен иметь хотя бы одну цель. Цель описывает вызов одной или нескольких команд или заданий (tasks). Мы можем задать имя цели с помощью атрибута «name» (name=«command»). Заданное имя становится командой для нашего сценария и может быть вызвана так:
C:\>ant command
В теге target также можно (но необязательно) указать зависимость с помощью атрибута «depends». Зависимости связывают цели между собой. Например, есть цель «compile», a есть «run», зависимая от «compile». И если мы выполняем «run», сначала выполняется «compile».
3. Минимально необходимый список заданий (tasks)
Стандартная версия Ant содержит более 150 заданий (https://ant.apache.org/manual/tasklist.html). Нам пока потребуются только семь:
- echo — вывод сообщения в консоль
- mkdir — создание директорий
- delete — удаление файлов и директорий
- javac — компиляция Java-кода
- java — запуск class и jar файлов
- jar — создание jar файла
- junit — запуск тестов
4. Простейший Ant-сценарий
Hello, World!
В этом сценарии у нас единственная цель с именем hello — вывести строку в консоль. Обратите внимание: в теге project мы задали имя проекта, с помощью атрибута name и цель по умолчанию, с помощью атрибута default.
Создадим каталог D:\Hello в корне диска D: (можно выбрать другой диск) и сохраним туда файл build.xml, содержащий предложенный выше сценарий. Запустим интерпретатор командной строки (Пуск/Выполнить/cmd), перейдём в наш каталог и вызовем ant:
D:\Hello>ant
Buildfile: D:\Hello\build.xmlhello:
[echo] Hello, World!
BUILD SUCCESSFULLTotal time: 0 seconds
Ant нашел файл сценария по умолчанию (build.xml), прочитал его и выполнил задание, заданное по умолчанию в теге project — hello. Мы получим такой же результат, если при вызове ant укажем в качестве параметра команду hello:
D:\Hello>ant hello
5. Пишем сценарий для сборки и тестирования Java проекта
Ant предоставляет полную свободу в формировании структуры каталогов. Мы создадим подкаталог src для исходных текстов на java. Это можно сделать в командной строке:
D:\Hello>md src
Там (D:\Hello\src) мы сохраним файл HelloWorld.java следующего содержания:
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello, World!");
}
}
Затем изменим текст сценария, получив следующее:
Теперь сценарий содержит четыре цели (команды): mkdir (создание папок для классов), compile (компиляция файла (ов) .java), run (запуск файла (ов) .class), clean (удаление результатов компиляции).
Запустим сценарий без параметров и увидим результат выполнения Java программы. Обратим внимание, что в сценарии есть цель clean, которая удаляет каталоги с результатами компиляции.
Прямое указание имен каталогов не говорит о хорошем стиле. Особенно если имена в сценарии повторяются. Модифицируем build.xml, используя property:
Затем добавим в сценарий цель/команду, которая формирует jar файл:
И убедимся что она работает:
D:\Hello>ant package
D:\Hello>java -jar build\HelloWorld.jar
Hello, World!
Перейдём к тестированию. Изменим код проекта (чтобы было что тестировать):
public class HelloWorld {
public static void main(String[] args) {
HelloWorld hello = new HelloWorld();
System.out.println(hello.sayHello());
}
String sayHello() {
return "Hello, World!";
}
}
и добавим в каталог src файл/класс (TestHello.java) с простым тестом:
import static org.junit.Assert.assertEquals;
import org.junit.Test;
public class TestHello {
@Test
public void testHello() {
HelloWorld hello = new HelloWorld();
assertEquals("Hello, World!", hello.sayHello());
}
}
Используя информацию со страницы github.com/junit-team/junit4/wiki/getting-started загрузим два файла, junit-4.12.jar и hamcrest-core-1.3.jar и скопируем их в каталог нашего \jre\lib\ext. Теперь можно проверить как работает тест в командной строке:
D:\Hello>java -cp build\classes org.junit.runner.JUnitCore TestHello
JUnit version 4.12
.
Time: 0,281
OK (1 test)
Дополним наш сценарий следующими строчками:
и дополним строку с заданием package (jar):
Теперь к списку команд нашего build файла (mkdir, compile, run, package) добавилась команда test. Проверим как она работает.
В заключение мы изменим код нашего проекта так, чтобы приветствие выводилось в отдельном графическом окне. Затем сформируем jar файл и запустим его двойным кликом мыши (у вас должно быть настроено выполнение jar по клику).
Третья версия кода проекта:
import javax.swing.*;
import java.awt.*;
public class HelloWorld extends JFrame {
public static void main(String[] args) {
new HelloWorld();
}
HelloWorld() {
setTitle(sayHello());
setDefaultCloseOperation(EXIT_ON_CLOSE);
setBounds(200, 200, 300, 200);
JLabel label = new JLabel(sayHello(), SwingConstants.CENTER);
label.setFont(new Font("", Font.BOLD, 24));
add(label);
setVisible(true);
}
String sayHello() {
return "Hello, World!";
}
}
Вносим незначительные дополнение в сценарий (в команде run), добавив fork=«true» (запуск выполнения класса в другой виртуальной машине). В противном случае run не сработает (проверено экспериментально):
Выполняем команду формирования jar (D:\Hello>ant package), открываем в проводнике каталог D:\Hello\build находим там файл HelloWorld.jar, дважды кликаем по нему мышкой и получаем удовольствие от созерцания графического окошка с приветствием.
Комментарии (5)
4 марта 2017 в 15:09
+4↑
↓
Аж слеза прокатилась по щеке.4 марта 2017 в 15:11
0↑
↓
Но статья будет не полной, если не упомянуть Apache Ivy
http://ant.apache.org/ivy/4 марта 2017 в 15:35
0↑
↓
Спасибо, учту. Хотя в ближайший планах аналогичная статья по Maven.
4 марта 2017 в 19:22
+4↑
↓
Посмотрел в календарь. Вроде 2017 на дворе.4 марта 2017 в 23:07 (комментарий был изменён)
0↑
↓
Откровенно говооря, тоже не понял, нафига сегодня об этом писать. Кому-то нужен учебный материал? Ну так извините, вот же оно: оно, нет? При этом еще в 2010 написано — и более подробно.