Gradle против Maven
25 Jan 2019Вечный срачик: “Maven лучше, чем Gradle”.
Давайте расскажу свои аргументы, почему лично я за Gradle. Использую его с 2011 года в Selenide, RePlay и большинстве рабочих проектов.
Чаще всего я слышу примерно такие аргументы за Maven:
- Maven заточен под стандартную структуру проекта, а большинство проектов ведь стандартные
- XML Мавена даёт autocompletion
- Пофиг, что Maven качает весь интернет - интернет сейчас быстрый и дешёвый
Давайте разбираться.
Аргумент 1: “Все проекты одинаковые”
Самое главное неверное предположение многих звучит примерно так:
99.95% Java проектов на этой планете относятся к категории bloody enterprise (кровавый ынтырпрайз), представляя собой стандартный JAR/WAR/EAR.
Мол, раз все проекты стандартные, то и гибкость билда никому не нужна. Бери Maven с его конвенциями и радуйся.
По моему опыту, всё ровно наоборот. 99.95% проектов на планете - и ынтерпрайз, и опенсорс - разные. Ни одному проекту на моей памяти не подошла стандартная мавеновская (или градловская) структура “из коробки”. Каждый проект хоть что-нибудь да кастомизирует.
Взять хотя бы тот же Selenide. Казалось бы, простенький опенсорсный проект безо всяких наворотов.
А его build.gradle уже вымахал на 256 строк.
Поэтому правильный вопрос не “нужно ли кастомизировать билд”, а “где кастомизировать билд проще”. И вот тут Maven однозначно проигрывает.
Аргумент 2: Кастомизация
В Maven, чтобы сделать что-то нестандартное, приходится писать свой плагин. А плагин - это отдельный проект, со своим отдельным билд-скриптом, который надо собрать, опубликовать, подключить…
Только подумайте: билд-скрипт для плагина для билд-скрипта, Карл!
А в Gradle ничего этого не надо. Пара строчек на Groovy прямо в том же build.gradle - и готово.
Да, в Groovy очень легко поставить куда-нибудь не туда пару фигурных скобочек, и меня это, честно говоря, бесит. Но это всё-таки меньшее из двух зол.
Аргумент 3: “XML даёт автозаполнение”
Да это чушь собачья! Да, действительно, XML проще по форме. То есть IDE сможет за тебя закрыть xml тэг или кавычку. Ну и всё. Но внутри этих тэгов как раз и скрывается вся сложность: какие плагины там описать, в каком порядке, с какими параметрами… Со всем этим XML уже не помогает.
А если ты хочешь какое-то действие запустить после какого-то? Хрен там, в Maven за кажущейся простотой XML прячется сложная система с лайфсайклами, профилями и т.д. - которую трудно понять и почти невозможно дебажить.
А в вашей команде ещё и нашёлся “умелец”, который написал плагин для мавена (а это единственный способ кастомизации билда)… Удачи в этом разобраться!
А вот в Gradle можно просто в одну строку сказать: “Запускай такое-то действие перед тестами”. И всё. Просто и наглядно.
Аргумент 4: “Интернет дешёвый”
Ещё один популярный аргумент: мол, то, что Maven выкачивает пол-интернета, не проблема - трафик нынче дешёвый.
Да, интернет действительно дешёв. Но дело-то не в объёме скачиваемых данных. А в том, что Maven явно скачивает слишком много и слишком долго. Это даже невооружённым глазом заметно.
Элементарный пример: команда mvn help:help выкачивает 6 MB зависимостей.
Чтобы показать свой собственный help!
Бонус: попросите о помощи
Кстати, то, что в Maven всё не как у людей, наглядно демонстрирует сама команда mvn help:help.
Почему не просто mvn help?
Как я вообще должен догадаться, что нужно через двоеточие два раза попросить о помощи? :) Что ещё за азбука Морзе XXI века?
Только посмотрите, какое понятное сообщение выдаёт Maven на простую просьбу о помощи:
> mvn help
[ERROR] Unknown lifecycle phase "help". You must specify a valid lifecycle phase or a goal
in the format <plugin-prefix>:<goal> or <plugin-group-id>:<plugin-artifact-id>[:<plugin-version>]:<goal>.
И просто для сравнения, вот Gradle:
> gradle help
:help
Welcome to Gradle 2.13.
To run a build, run gradle <task> ...
To see a list of available tasks, run gradle tasks
To see a list of command-line options, run gradle --help
Разница как между “Запорожцем” и “Ауди”.
Ложка дёгтя
Билд-скрипт для Gradle пишется на Groovy. В нём легко допустить ошибку синтаксиса. Легко куда-нибудь не туда впердолить кавычку.
Никогда не знаешь, правильно version: "1.2.3" или version = "1.2.3". Или вообще version "1.2.3".
Это меня тоже бесит в градле. Можно сказать, что меня полностью не устраивают оба тула.
Но из двух зол Gradle всё-таки меньшее.
Итого
- Стандартных проектов не бывает. Каждый билд рано или поздно приходится кастомизировать.
- В Gradle кастомизация - это пара строчек в том же файле. В Maven - отдельный плагин, отдельный проект.
- Maven качает слишком много и слишком долго. И дело не в цене трафика, а во времени.
- И да, Gradle тоже кое-чем может бесить.
Complexity is the path to the dark side
