Comments 36
ИМХО, билд скрипты должны быть скриптами, т.е. полноценными программами по сборке. Gradle предоставляет золотую середину между сложностью написания таких скриптов и автоматизированным выполнением рутинных задач.
Maven в свою очередь экстремально декларативен, и если не дай б*г надо что то сделать нестандартное (структура проекта, жизненный цикл сборки и т.п.), то мавен принесет много боли.
Опять же имхо, в 21 веке будущее за гибкостью.
И всё хорошо, когда сам пишешь этот скрипт, но вот когда его пишет кто-то другой, а тебе надо кусочек поправить.
Так в этом все и дело… Gradle нашел золотую середину и поэтому Maven остается не у дел, как в свое время оставался не удел Ant. Мир меняется, концепция тоже, а мы (разработчики) как двигатели должны использовать самое лучшее что придумано.
Поэтому фраза про фломастеры мне показалось плохим аргументом в пользу мавена. Gradle объективно более удачный инструмент => на него следует переходить и, отдав должные почести, оставить уже мавен в покое.
Приведите, если не трудно, преимущества или недостатки одного над другим.
«Гибкость» в вашем твите это скорее преимущество градла, чем недостаток. Гибкость позволяет сделать то же самое, но с заделом под изменяющиеся условия.
Мне действительно интересно, потому что сталкивался не раз с адептами, которые с пеной у рта доказывают, что лучше мавена ничего нет и не было, и тащат его во все проекты. При этом какой-то внятной позиции добиться не удалось…
Вы не подумайте, я не адепт градла, если завтра выйдет тулза MavGradle, которая будет лучше работать и лучше подходить моим задачам, я стремительно туда перейду. Ну по-моему просто мавен уже морально устарел по приведенным мной выше аргументам.
В то время как у maven модель фиксированная, что значительно облегчает работу с проектами. Опять же юниор на проекте не успееет много сломать. Можно вовремя его поправить.
1) Жесткая структура убивает многомодульные проекты со сложной иерархией.
2) Документация в многомодульных проектах генерируется отвратно и слабо настраивается (отчеты checkstyle, PMD, javadoc)
3) Нельзя положить исходники соседнего проекта и организовать билд-цепочку (при изменении в одном модуле ребилдить другой)
4) Нельзя настроить жизненный цикл по своему усмотрению
5) Если надо настроить сложный билд для нескольких языков, приходится юзать Ant с запуском настоящих билд скриптов :)
В моем случае речь не о новичках и сложности при анализе билд-скриптов, а сугубо инженерные проблемы. Хотя если опять же проект достаточно сложный, то читать и анализировать помник на пару тысяч строк, тоже то еще удовольствие…
2. Ничего не могу сказать — вполне возможно, что это и так. Я документацию не генерирую, а когда приходилось по работе (проект из 10-20 модулей) никогда проблем не было. Правда мы её настраивать не пытались :) Результат «из коробки» нас вполне устроил.
3. Не очень понял :) Куда положить? У меня проекты через 2-3 транзитивные зависимости вполне внятно работают с исходниками (для GWT надо) Где организовать? IDE сама разбирается, CI сервер тоже (хотя я это сейчас не использую)
4. Можно, но сложно (очень сложно) — и это плюс IMHO
5. А вот тут я с вами соглашусь, пожалуй. Maven это только для Java.
1 — практических проблем с многомодульными проектами в Maven нет, могут быть исключительно архитектурные проблемы, но с ними без костыляния и Gradle не справится.
2 — Нет никаких проблем с настройкой документации — тут вам и doxygen для специфичных видов документации, и velocity, и docbook, а оборачивается это все через пару плагинов — javadoc, site-plugin, дальше лишь решаете в каком виде вы получить это хотите.
3 — Весьма сомнительная ситуация, когда вы вместо скомпилированной зависимости проекта хотите использовать ее сборку в процессе билда — если она используется только в текущем проекте, внедрите ее как модуль, если же она используется и в других проектах, наиболее логично будет предоставить ей свой релизный цикл и устанавливать взаимоотношения через бинарные зависимости.
4 — ИМХО lifecycle Maven содержит все возможные стадии жизни исходного кода и отхождение от него также указывает на какую-то архитектурную, либо логическую ошибку в процессе сборки, другой момент, когда вы хотите вместить какую-нибудь специфичную для проекта операцию на той или иной стадии цикла, то вы просто используете фазы сборки. Мне сложно представить ситуацию когда генерация кода должна идти после компиляции, но и это не проблема, перекиньте исполнение плагина на соответствуюшую фазу и вуаля. Кроме того, если уж вам действительно необходимо это сделать, напишите свой плагин и сделайте extend на ту или иную фазу цикла, вот вам и кастомное поведение.
5 — Прекрасно все настраивается, лично писал сборку для SDK под одну платформу, где и C/C++, C#, Android с NDK, lua, Flex и т.д.
На одной из конференций был адвокат Gradle, который 1 час потратил на то, чтобы рассказать какие есть у Gradle рюшечки относительно Maven, но реальных технических оснований для перехода так и не озвучил — вот здесь есть такой красивый отчетик, вот тут оно в демоне собирается(но иногда демон подвисает и его надо жестко убивать). Все то, что он в итоге рассказал в сравнении с Maven реально просто делается и на Maven, на мой прямой вопрос почему он это сделал только с Gradle, ответом было, что он не знал что это можно сделать в Maven.
Как-то я приводил уже на хабре ссылку на проект собираемый Maven с количеством модулей 100+, с документацией, к сожалению, на чистой Java, но приведу еще один раз, на всякий случай — github.com/vporoxnenko/mbsa
P.S. Вы не любите кошек? — Да вы просто не умеете их готовить.
P.P.S. Единственное достоинство Gradle, которое я действительно оценил, это инкрементальная компиляция, которая работала стабильнее чем реализация от takari-lifecycle-plugin пару лет назад.
2 — А вот и есть. Пробовал в многомодульном проекте со сложной иерархией прикрутить site-pulgin в связке с Swagger. Не разрешимая проблема это перекрестные ссылки между модулями по REST API, javadoc и др. Мавен просто не дает таких опций. А если нет сквозной навигации, зачем тогда вообще делать такой плагин?
3 — Почему? У меня есть сторонняя либа, которая разрабатывается соседней командой. Я не хочу поднимать общий мавеновский репозиторий для них, но хочу получать правки по определенным тегам из VCS, чтобы получать нужный мне API.
4 — Я лично с такой проблемой не сталкивался, просто слышал стоны своих коллег :) Однако, я хочу написать свой сборочный шаг (не важно фазу или шаг ЖЦ), чтобы он был написан в виде программы, потому что компиляция сложная для этого проекта. Почему мне советуют писать плагин для системы сборки, это как то неправильно, не находите?
5 — Ага, и что вы использовали из мавеновского арсенала? Вангую, что Ant :)
Адепты тех или иных инструментов есть всегда. Если инструмент может порешать мою боль, я им с радостью воспользуюсь. Мавен тем не менее крут своим репозиторием, тут этого не отнять…
Про проект с 100+ модулей — я открыл корневой помник… 1700 строк… Интересно (без сарказма), как будет выглядеть градловский скрипт сборки.
P.S. я с мавеном жил много много лет, готовить я его умею, но прогресс же не стоит на месте.
Относительно корневого пома, лишь отчасти согласен, все дело в том, что он передает абсолютно все параметры настройки как плагинов, так и зависимостей, в частности чтобы избежать jar-hell, а также для конфигурации всего проекта из единого файла, и такая конфигурация в Gradle содержала бы не намного меньше параметров и строчек кода и только благодаря прямому указанию параметров в одной строке, например зависимостей, но не более того — я знаю это потому что писал многомодульные проекты как на одном так и на другом.
Обратите внимание лучше на подмодули проекта, например github.com/vporoxnenko/mbsa/blob/master/server/document/pom.xml и его подмодуль github.com/vporoxnenko/mbsa/blob/master/server/document/ui/pom.xml — они достаточно компактны именно благодаря большому корневому pom'у и наследованию параметров от вышестоящих объектов, в компаниях же данную проблему решает superpom, который не было смысла выделять в данном проекте.
Для примера, superpom в моей компании содержит 800 строк, тогда как наследуемые проекты и парент-помы подпроектов компании, благодаря ему не более 300.
По пункту 3. — потому что вместе с исходниками соседнего проекта вы хотите притащить в свой еще и знание о том, как их собирать.
В этом месте вы хотите плохого. Не хочу осуждать, потому что для этого надо реально лучше знать ваш проект, но такие желания не следует поддерживать системой сборки.
Почему мне советуют писать плагин для системы сборки, это как то неправильно, не находите?
Хм. То есть, писать всю сборку на груви вам не в лом, а написать плагин (по простым правилам) почему-то не нравится? Это как-то неправильно тоже, не находите? Ну или не так — может это и правильно, но в такой формулировке это выглядит как чистая вкусовщина. Все имеют право на то, чтобы выбирать инструмент, но тогда надо так и формулировать — что это вкусы?
Gradle нашел золотую середину и поэтому Maven остается не у дел
Голословное утверждение. Либо приведите какое-то подтверждение в виде статистики.
Есть куча кейсов, которые простейшим образом покрываются с помощью Maven: добавить зависимости, сконфигурировать плагины, получить свой JAR/WAR и забыть. Причем все это будет в стандартном и понятном каждому виде, а не порождением чьего-то мутного сознания в стиле «привет-Ant».
Нет никакой необходимости в гибкости там, где от нее никакого проку.
Сравните объем файлов декларативного мавена и процедурного градла по простейшему билду.
Собственно, наглядная иллюстрация «Maven не у дел»:
PS
Не обязательно срать в карму, когда аргументы отсутствуют.
P.S. я к вам в карму не лез, такой ерундой не занимаюсь.
Поэтому я совершенно не понимаю, что должна означать фраза «остается не у дел», когда Maven успешно решает задачи для множества разработчиков и проектов.
Еще раз только могу повторить — плагины для мавена пишутся просто. Более того, при большом желании, и небольшими усилиями вы вполне можете притащить в них всю (или почти всю) функциональность плагинов gradle, потому что это не более чем классы. И гибкость тоже никто не ограничивает. Вы вполне можете писать плагины, которым вообще не нужен POM, вы можете брать информацию для сборки откуда угодно, и пользоваться любыми инструментами.
ИМХО, билд скрипты должны быть скриптами, т.е. полноценными программами по сборке.
Кому они должны, и почему? И вы видимо не слышали про gmaven, например? Там все ровно также, как в gradle (и да, я работал с обоими, если что). И плагины к мавену пишутся вовсе не сложно (и опять же да, я написал с десяток-другой). Нет там никакой боли, воообще. Любая структура проекта, включая никакой (плагины, которым не нужен POM, на минутку, существуют). Все эти сказочки про боль расширения мавена явно написаны теми, кому все равно лень изучить groovy.
dependencyManagement:
dependencies:
- groupId: org.checkerframework
artifactId: checker-qual
version: 2.1.10
- groupId: org.checkerframework
artifactId: checker
version: 2.1.10
- groupId: org.checkerframework
artifactId: jdk8
version: 2.1.10
Можно в одну строчку писать, если хочется.
Идеальный мавен. Часть 1