Maven против Gradle: как выбрать правильный инструмент сборки

Maven против Gradle: как выбрать правильный инструмент сборки

28 марта 2022 г.

Автоматизация сборки является важным аспектом разработки программного обеспечения. В этой статье мы сравним два самых популярных инструмента сборки для Java-разработки: Maven и Gradle.


Make и Apache Ant


Раньше разработчики использовали инструмент Make для создания проектов Java, и процесс сборки мало чем отличался от создания приложений на любом другом языке. Затем, в 2000 году, была выпущена система сборки Ant (еще один аккуратный инструмент).


Ant, как и Make, использует императивный стиль, но скрипты сборки имеют синтаксис XML. Ant был разработан как система сборки, предназначенная для Java-проектов. Ant — это система автоматизации сборки на основе Java, поэтому Java-разработчику гораздо проще расширить ее функциональность.


Мейвен


Однако уже в 2004 году была предложена новая система сборки Maven, которая по-новому взглянула на процесс сборки Java-приложений. Раньше разработчики сами организовывали структуру папок для хранения исходных кодов, ресурсов, каталогов путей к классам и выходных каталогов.


И поэтому скрипты сборки Ant для двух разных приложений могли сильно отличаться: компиляция, сборка, копирование файлов в выходной каталог и т.д. прописывались отдельно. В Maven проект Java всегда имеет преднамеренно определенную структуру.


Например, исходники должны быть в src/main/java, ресурсы для тестов в src/test/resources. Maven позволяет создать файловую структуру типичного проекта с помощью одной команды. Maven также вводит понятие «жизненного цикла сборки» с последовательными фазами:


подтвердитьскомпилироватьпроверитьсделать пакетпроверитьустановитьразвернуть


Теперь, благодаря фиксированной структуре папок и набору целей, нет необходимости писать и поддерживать большой скрипт сборки и скрипты сборки стали декларативными. Разработчикам стало удобнее работать не только с собственным кодом, но и со сторонними проектами, потому что понятно, как устроен исходный код и как его собирать.


В мире Java довольно много библиотек, и серьезное приложение использует их сотни. При использовании Ant необходимо самостоятельно добавить в проект необходимые jar-файлы. Вам также необходимо позаботиться о необходимых транзитивных зависимостях.


Maven предоставляет функции диспетчера зависимостей и центральный репозиторий Maven. Теперь при указании новой зависимости в скрипте сборки Maven автоматически найдет нужный jar соответствующей версии и все его транзитивные зависимости, скачает их и проследит, чтобы они попали в classpath проекта.


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


Следует отметить, что Ant можно использовать совместно с проектом Apache Ivy, который также позволяет управлять зависимостями и работать с репозиториями Maven.


Несмотря на все преимущества Maven, его декларативный подход в некоторых ситуациях может оказаться недостатком. Например, когда вам нужно изменить жизненный цикл сборки и добавить новые цели в процесс сборки.


Maven позволяет расширять его функциональность с помощью плагинов. Существует множество готовых плагинов Maven, решающих разные типовые задачи, и эти плагины также доступны из центрального репозитория.


Однако, если по каким-то причинам необходимо немного изменить стандартный жизненный цикл, а подходящего плагина нет, разработчику придется самостоятельно создавать свой плагин.


Грейдл


В 2008 году был выпущен первый релиз системы сборки Gradle, а в 2012 году вышла версия 1.0. Цель проекта Gradle — сохранить все преимущества Maven, но также дать разработчику больше возможностей для настройки процесса сборки .


Вот почему скрипты сборки Gradle написаны на Groovy DSL. Gradle предоставляет возможность писать декларативные сценарии сборки и более компактен, чем Maven, потому что XML довольно громоздкий. Также легко добавить нестандартную логику в процесс сборки в Gradle, достаточно написать Groovy-скрипт, и не нужно разрабатывать плагины.


В то же время вы можете легко отлаживать выполнение скриптов сборки, так как они представляют собой обычные файлы Groovy. Таким образом, Gradle сочетает в себе декларативный и императивный подходы. Начиная с версии 5.0, Gradle также поддерживает Kotlin DSL.


Gradle также поддерживает плагины, что позволяет разработчикам обмениваться готовыми настройками.


Также одним из существенных преимуществ Gradle является инкрементальная сборка. При перезапуске сборки Gradle определяет, изменились ли файлы, являющиеся входными данными для таргета, и если нет, то выполнение таргета пропускается, поскольку его выходные артефакты уже собраны.


Это дает значительное увеличение скорости сборки по сравнению с Maven, особенно в больших многомодульных проектах. Gradle также может запускать демон Gradle, фоновый процесс, который позволяет избежать затрат ресурсов и времени на инициализацию при каждом запуске сборки.


В Gradle есть удобная функция Gradle-обертки — это возможность генерировать командные сценарии оболочки и Windows, которые автоматически загружают дистрибутив Gradle указанной версии и используют его для сборки проекта.


Это означает, что для сборки проекта Gradle вам не нужно отдельно устанавливать Gradle, достаточно просто установить Java. И также довольно легко переключить проект на другую версию Gradle.


Выбор между Maven и Gradle


Несмотря на преимущества Gradle, довольно много проектов используют систему сборки Maven. Выбор зависит от типа проекта и команды.


Maven используется с 2004 года, поэтому с ним знакомо больше разработчиков. Кроме того, Maven стабилен, последняя мажорная версия 3 была выпущена в 2010 году. Gradle уже несколько раз существенно менялся без обратной совместимости, и разработчикам приходилось переносить свои скрипты сборки на новые версии.


Кроме того, не все знакомы с Groovy или Kotlin, поэтому использование Gradle требует дополнительных знаний, тогда как Maven использует понятный XML. Поэтому возникает вопрос, если проект начал разрабатываться до того, как Gradle стал популярным, есть ли смысл переносить скрипты сборки на Gradle.


С другой стороны, все больше и больше разработчиков выбирают Gradle. Spring, Hibernate и LinkedIn используют Gradle. Кроме того, системой сборки Android является Gradle, и она популярна среди разработчиков приложений для Android.


Все популярные IDE имеют интеграцию с обеими системами сборки и поддерживают автодополнение при редактировании скриптов сборки. Как для Maven, так и для Gradle разработано огромное количество плагинов, которые позволяют добавлять часто используемые функции в процесс сборки проекта.


Заключение


Из плюсов и минусов каждой из описанных выше систем сборки можно сделать следующий вывод. Maven больше подходит для небольших проектов, не требующих настройки процесса сборки, да и время сборки проекта не так критично. Gradle больше подходит для масштабных проектов с большим количеством модулей, а также для Android-приложений.



Оригинал
PREVIOUS ARTICLE
NEXT ARTICLE