Gradle против Maven

Вечный срачик: “Maven лучше, чем Gradle”.

Давайте расскажу свои аргументы, почему лично я за Gradle. Использую его с 2011 года в Selenide, RePlay и большинстве рабочих проектов.

Чаще всего я слышу примерно такие аргументы за 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 всё-таки меньшее.

Итого

Андрей Солнцев

asolntsev.github.io