Выбор правильного инструмента сборки: Ant против Maven против Gradle
Во время разработки программного обеспечения разработчикам приходится перестраивать один и тот же код снова и снова. Они часто пытаются использовать сценарии bash или другие языки сценариев для автоматизации задачи. Однако есть инструменты сборки, которые больше подходят для автоматизации сборки. Преобладающие инструменты сборки:
- Муравей Apache с плющом
- Maven
- Gradle
Давайте исследуем инструменты, чтобы узнать больше.
Муравей Apache с плющом
Apache Ant - это инструмент командной строки на основе Java, который использует файлы XML для определения сценариев сборки. Он преимущественно используется для сборок Java, но его также можно использовать для разработки на C / C ++. Встроенные задачи позволяют компилировать, собирать, тестировать и запускать программные приложения. Пользователи также могут создавать свои собственные «антенные библиотеки» для улучшения функциональности Ant. Apache Ivy - это инструмент управления зависимостями, который легко интегрируется с Ant для обеспечения более надежной экосистемы. Разработка Ant началась в 2000 году.
Плюсы
- Лучший контроль над общим процессом сборки
- Достаточно гибок, чтобы работать с любым рабочим процессом
Минусы
- Файлы сборки на основе XML могут увеличиваться в размерах и становиться недоступными для обслуживания
- Для поддержки сценариев сборки необходимо много времени и ресурсов
- Интеграция IDE затруднена
Пример муравья с плющом
Вы можете установить последнюю версию Ant отсюда. Вы должны загрузить zip, развернуть и поместить папку bin на свой путь. Вы можете использовать следующую команду, чтобы проверить, правильно ли установлен Ant:
$ ant -versionApache Ant (TM) версии 1.10.1 составлено 2 февраля 2017 г
После установки Ant вы можете загрузить последнюю версию Ivy jar и поместить ее в папку lib внутри каталога Ant.
После установки Ant создайте папки helloworld и helloworld / src. Внутри папки src поместите helloworld.java файл с кодом:
/ **************************Распечатывает "Hello World"!"
*************************** /
public class helloworld
public static void main (String [] args)
Система.вне.println ("Привет, мир!");
Теперь в папке helloworld создайте сборку.xml со следующим кодом:
И в той же папке helloworld создайте плющ.xml со следующим кодом:
Структура каталогов должна выглядеть так:
Привет мир| - построить.xml
| - плющ.xml
'- src
'-- Привет мир.Ява
Теперь вы можете запустить сборку с помощью команды:
$ муравейникУспешная сборка должна выдавать следующий результат:
$ муравейникФайл сборки: / Users / zak / _work / LearnBuildScripts / LearnANT / helloworld / build.xml
разрешить:
[ivy: retrieve] :: Apache Ivy 2.4.0-20141213170938 :: http: // ant.апач.org / ivy / ::
[ivy: retrieve] :: настройки загрузки :: url = jar: file: / Users / zak / BuildTools / ANT / apache
-муравей-1.10.1 / lib / ivy-2.4.0.банка!/ org / apache / ivy / core / настройки / ivysettings.xml
[ivy: retrieve] :: разрешение зависимостей :: org.apache # helloworld; [электронная почта защищена]
MacBook Air.местный
[ivy: retrieve] confs: [по умолчанию]
[ivy: retrieve] найдено junit # junit; 4.12 на публике
[ivy: retrieve] найденная организация.hamcrest # hamcrest-core; 1.3 на публике
[ivy: retrieve] :: отчет о разрешении :: разрешение 397 мс :: артефакты дл 15 мс
---------------------------------------------------------------------
| | модули || артефакты |
| conf | номер | поиск | dwnlded | выселен || номер | dwnlded |
---------------------------------------------------------------------
| по умолчанию | 2 | 0 | 0 | 0 || 4 | 0 |
---------------------------------------------------------------------
[плющ: получение] :: получение :: org.apache # helloworld
[ivy: retrieve] confs: [по умолчанию]
[ivy: retrieve] 0 артефактов скопировано, 4 уже извлечено (0 КБ / 39 мс)
компилировать:
[mkdir] Созданный каталог: / Users / zak / _work / LearnBuildScripts / LearnANT / helloworld / build /
классы
[javac] / Users / zak / _work / LearnBuildScripts / LearnANT / helloworld / build.xml: 22: предупреждение:
'includeantruntime' не задано, по умолчанию создается.sysclasspath = последний; установить на ложь
для повторяемых сборок
[javac] Компиляция 1 исходного файла в / Users / zak / _work / LearnBuildScripts / LearnANT /
helloworld / сборка / классы
банка:
[mkdir] Созданный каталог: / Users / zak / _work / LearnBuildScripts / LearnANT / helloworld / build / bin
[jar] Сборка jar: / Users / zak / _work / LearnBuildScripts / LearnANT / helloworld / build / bin /
Привет мир.банка
СТРОИТЬ УСПЕШНО
Общее время: 6 секунд
Вы можете попробовать файл jar следующим образом:
$ java -cp build / bin / helloworld.банка helloworldПривет мир!
Мы определили файл jar, который нужно поместить в папку build / bin. Папки создаются во время сборки. Команда ant jar вызывает цель jar в сборке.xml.
Maven
Maven был разработан для решения проблем, возникающих при написании сценариев на основе Ant. Он сохранил файлы XML, но использовал другой подход к организации. В Ant разработчики должны создавать все задачи. Maven уменьшает количество задач, создаваемых за счет внедрения более строгих стандартов организации кода. В результате легче приступить к стандартным проектам.
Он также представил загрузки зависимостей, которые упростили разработку. До появления Ivy в Ant пользователям приходилось управлять зависимостями локально. Maven первым принял философию управления зависимостями.
Однако строгие стандарты Mavens затрудняют написание собственных сценариев сборки. С инструментом легко работать, если проект соответствует строгим стандартам.
Плюсы
- Автоматическая загрузка зависимостей
- Все зависимости автоматически записываются в систему управления версиями как часть скриптов Maven
- Стандартизирует и упрощает процесс сборки
- Легко интегрируется с IDE и системами CI / CD
Минусы
- Не гибок в создании настраиваемых рабочих процессов
- Крутая кривая обучения, и этот процесс трудно понять новичкам
- Требуется много времени для решения проблем сборки и интеграции новых библиотек
- Не годится для нескольких версий одной и той же зависимости
Пример Maven
Вы можете скачать последнюю версию Maven отсюда. Проверить установку можно так:
$ mvn --versionApache Maven 3.5.2 (138edd61fd100ec658bfa2d307c43b76940a5d7d; 2017-10-18T00: 58: 13-07: 00)
Главная страница Maven: / Users / zak / BuildTools / Maven / apache-maven-3.5.2
Версия Java: 1.8.0_74, производитель: Oracle Corporation
Домашняя страница Java: / Библиотека / Java / JavaVirtualMachines / jdk1.8.0_74.jdk / Содержание / Главная / jre
Локаль по умолчанию: en_US, кодировка платформы: UTF-8
Название ОС: «mac os x», версия: «10.11.6 ", арка:" x86_64 ", семейство:" mac "
Создайте папку helloworld и сгенерируйте проект с помощью следующей команды:
Архетип $ mvn: сгенерировать -DgroupId = com.название компании.helloworld -DartifactId = helloworld-DarchetypeArtifactId = maven-archetype-quickstart -DinteractiveMode = false
Он должен создать структуру папок и сгенерировать вывод, который выглядит следующим образом:
[INFO] Поиск проектов…[ИНФОРМАЦИЯ]
[ИНФОРМАЦИЯ] ------------------------------------------------------------------------
[INFO] Сборка проекта Maven Stub (без POM) 1
[ИНФОРМАЦИЯ] ------------------------------------------------------------------------
[ИНФОРМАЦИЯ]
[ИНФОРМАЦИЯ] >>> maven-archetype-plugin: 3.0.0: сгенерировать (по умолчанию-cli)> сгенерировать-источники
@ standalone-pom >>>
[ИНФОРМАЦИЯ]
[ИНФОРМАЦИЯ] <<< maven-archetype-plugin:3.0.0:generate (default-cli) < generate-sources
@ автономный-pom <<<
[ИНФОРМАЦИЯ]
[ИНФОРМАЦИЯ]
[ИНФОРМАЦИЯ] --- maven-archetype-plugin: 3.0.0: сгенерировать (default-cli) @ standalone-pom ---
[INFO] Создание проекта в пакетном режиме
[ИНФОРМАЦИЯ] ----------------------------------------------------------------------------
[ИНФОРМАЦИЯ] Использование следующих параметров для создания проекта из Старого (1.х) Архетип:
maven-archetype-quickstart: 1.0
[ИНФОРМАЦИЯ] ----------------------------------------------------------------------------
[INFO] Параметр: basedir, Значение: / Users / zak / _work / LearnBuildScripts / LearnMaven
[INFO] Параметр: package, Значение: com.название компании.Привет мир
[INFO] Параметр: groupId, Значение: com.название компании.Привет мир
[ИНФОРМАЦИЯ] Параметр: artifactId, значение: helloworld
[ИНФОРМАЦИЯ] Параметр: packageName, Значение: com.название компании.Привет мир
[INFO] Параметр: версия, значение: 1.0-SNAPSHOT
[INFO] проект создан из Старого (1.x) Архетип в каталоге: / Users / zak / _work /
LearnBuildScripts / LearnMaven / helloworld
[ИНФОРМАЦИЯ] ------------------------------------------------------------------------
[ИНФОРМАЦИЯ] СОЗДАТЬ УСПЕХ
[ИНФОРМАЦИЯ] ------------------------------------------------------------------------
[INFO] Общее время: 8.602 с
[ИНФОРМАЦИЯ] Окончание: 2018-01-27T00: 05: 37-08: 00
[ИНФОРМАЦИЯ] Конечная память: 15M / 152M
[ИНФОРМАЦИЯ] ------------------------------------------------------------------------
Структура папок должна выглядеть так:
Привет мир| - пом.xml
'- src
| - главная
| '-- Ява
| '- com
| '-- название компании
| '-- Привет мир
| '-- Приложение.Ява
'-- контрольная работа
'-- Ява
'- com
'-- название компании
'-- Привет мир
'- AppTest.Ява
Пом.xml содержит конфигурации сборки. Внутри пом.xml код выглядит так:
_0.xsd ">
Вы можете создать файл jar, используя следующую команду:
пакет $ mvn[INFO] Поиск проектов…
[ИНФОРМАЦИЯ]
[ИНФОРМАЦИЯ] ------------------------------------------------------------------------
[INFO] Сборка helloworld 1.0-SNAPSHOT
[ИНФОРМАЦИЯ] ------------------------------------------------------------------------
[ИНФОРМАЦИЯ]
[ИНФОРМАЦИЯ] --- плагин-ресурсы-maven: 2.6: ресурсы (ресурсы по умолчанию) @ helloworld ---
[ПРЕДУПРЕЖДЕНИЕ] Использование кодировки платформы (на самом деле UTF-8) для копирования отфильтрованных ресурсов, i.е.
сборка зависит от платформы!
[INFO] пропустить несуществующий ресурсDirectory / Users / zak / _work / LearnBuildScripts / LearnMaven /
helloworld / SRC / основные / ресурсы
[ИНФОРМАЦИЯ]
[ИНФОРМАЦИЯ] --- плагин-компилятор-maven: 3.1: компилировать (компилировать по умолчанию) @ helloworld ---
[ИНФОРМАЦИЯ] Обнаружены изменения - перекомпиляция модуля!
[ПРЕДУПРЕЖДЕНИЕ] Не задана кодировка файла с использованием кодировки платформы UTF-8, i.е. сборка
зависит от платформы!
[INFO] Компиляция 1 исходного файла в / Users / zak / _work / LearnBuildScripts / LearnMaven /
helloworld / цель / классы
[ИНФОРМАЦИЯ]
[ИНФОРМАЦИЯ] --- плагин-ресурсы-maven: 2.6: testResources (default-testResources) @
Привет мир ---
[ПРЕДУПРЕЖДЕНИЕ] Использование кодировки платформы (на самом деле UTF-8) для копирования отфильтрованных ресурсов, i.е.
сборка зависит от платформы!
[INFO] пропустить несуществующий ресурсDirectory / Users / zak / _work / LearnBuildScripts / LearnMaven /
helloworld / SRC / тест / ресурсы
[ИНФОРМАЦИЯ]
[ИНФОРМАЦИЯ] --- плагин-компилятор-maven: 3.1: testCompile (по умолчанию-testCompile) @ helloworld ---
[ИНФОРМАЦИЯ] Обнаружены изменения - перекомпиляция модуля!
[ПРЕДУПРЕЖДЕНИЕ] Не задана кодировка файла с использованием кодировки платформы UTF-8, i.е. сборка
зависит от платформы!
[INFO] Компиляция 1 исходного файла в / Users / zak / _work / LearnBuildScripts / LearnMaven
/ helloworld / target / test-классы
[ИНФОРМАЦИЯ]
[ИНФОРМАЦИЯ] --- maven-surefire-plugin: 2.12.4: тест (тест по умолчанию) @ helloworld ---
[ИНФОРМАЦИЯ] Каталог отчетов Surefire: / Users / zak / _work / LearnBuildScripts / LearnMaven
/ helloworld / target /
надежные отчеты
-------------------------------------------------------
Т Е С Т С
-------------------------------------------------------
Бегущий ком.название компании.Привет мир.AppTest
Выполненные тесты: 1, Ошибки: 0, Ошибки: 0, Пропущено: 0, Истекшее время: 0.014 с
Полученные результаты :
Выполненных тестов: 1, сбоев: 0, ошибок: 0, пропущенных: 0
[ИНФОРМАЦИЯ]
[ИНФОРМАЦИЯ] --- maven-jar-plugin: 2.4: jar (по умолчанию-jar) @ helloworld ---
[ИНФОРМАЦИЯ] Создание jar-файла: / Users / zak / _work / LearnBuildScripts / LearnMaven / helloworld / target /
helloworld-1.0-SNAPSHOT.банка
[ИНФОРМАЦИЯ] ------------------------------------------------------------------------
[ИНФОРМАЦИЯ] СОЗДАТЬ УСПЕХ
[ИНФОРМАЦИЯ] ------------------------------------------------------------------------
[ИНФОРМАЦИЯ] Общее время: 5.624 с
[ИНФОРМАЦИЯ] Окончание: 2018-01-27T00: 11: 10-08: 00
[ИНФОРМАЦИЯ] Конечная память: 16M / 114M
[ИНФОРМАЦИЯ] ------------------------------------------------------------------------
Вы можете запустить файл jar следующим образом:
$ java -cp target / helloworld-1.0-SNAPSHOT.jar com.название компании.Привет мир.ПриложениеПривет мир!
Файл jar помещается в целевую папку.
Gradle
Gradle сочетает в себе мощь Ant и Maven. Первая версия Gradle была выпущена в 2012 году. Он видел быстрое принятие. Google в настоящее время использует его для ОС Android.
Вместо XML в Gradle используется язык Groovy. В результате скрипты сборки в Gradle легче писать и читать. Первоначально он использовал Ivy для управления зависимостями, но теперь он использует собственный механизм зависимостей.
Плюсы
- Обеспечивает стандартизацию при сохранении гибкости
- Легко читать и писать сценарии сборки
- Лучше обрабатывать несколько версий зависимостей
- Способен работать с несколькими языками программирования и технологиями
- Активное сообщество, помогающее разрабатывать инструмент
- Gradle DSL (предметно-ориентированный язык) упрощает структуру конфигурации
- Gradle обеспечивает повышение производительности с помощью поэтапного использования кеша сборки и Gradle Daemon
Минусы
- Интеграция IDE не так хороша, как Maven
Пример Gradle
Вы можете установить Gradle отсюда. После того, как вы настроили Gradle на своем пути, вы можете проверить это:
$ gradle --version------------------------------------------------------------
Gradle 4.5
------------------------------------------------------------
Время сборки: 2018-01-24 17:04:52 UTC
Ревизия: 77d0ec90636f43669dc794ca17ef80dd65457bec
Groovy: 2.4.12
Муравей: Apache Ant (TM) версии 1.9.9 составлено 2 февраля 2017 г
JVM: 1.8.0_74 (Oracle Corporation 25.74-b02)
ОС: Mac OS X 10.11.6 x86_64
Затем создайте следующую структуру каталогов:
Привет мир| - построить.Gradle
'- src
| - главная
'-- Ява
'-- Привет мир
'-- Привет мир.Ява
Для helloworld.java поместил код из примера Ant. И для сборки.gradle введите следующий код:
применить плагин: 'java'версия = '1.0 '
репозитории
mavenCentral ()
dependencies
Группа testCompile: 'junit', имя: 'junit', версия: '4.12 '
Вы можете использовать команду «gradle tasks -all», чтобы просмотреть все доступные команды. Gradle автоматически подбирает плагины, указанные в сборке.gradle и показывает дополнительные задачи, доступные благодаря плагинам.
Вы можете получить сборку, запустив:
$ gradle jarСТРОИТЬ УСПЕШНО за 1 секунду
2 действенные задачи: 2 выполнены
Вы можете запустить свою банку так:
$ java -cp build / libs / helloworld-1.0.банка helloworldПривет мир!
Файл jar помещается в папку build / libs.
Заключение
Среди инструментов сборки Ant может быть полезен для небольших проектов, в то время как Maven лучше подходит для обеспечения того, чтобы все разработчики следовали одним и тем же правилам. Gradle - это новейший инструмент, обеспечивающий максимальную гибкость.
Рекомендации:
- http: // муравей.апач.org /
- http: // муравей.апач.org / ivy /
- https: // maven.апач.org /
- https: // gradle.org /
- http: // makble.com / gradle-junit-helloworld-example
- https: // примеры.javacodegeeks.com / core-java / gradle / gradle-hello-world-tutorial /
- https: // gradle.org / maven-vs-gradle /
- https: // maven.апач.org / руководства / начало работы / maven-за пять минут.html
- https: // stackoverflow.ком / вопросы / 20755437 / java-build-tools-ant-vs-maven
- https: // technologyconversations.ru / 2014/06/18 / build-tools /
- https: // www.квора.com / Какие-плюсы и минусы-Maven-против-Ant-as-building-tools-for-Java