Зачем использовать Gradle вместо Ant или Maven? [закрыто]

324

Что в действительности дает мне другой инструмент сборки, ориентированный на Java?

Если вы используете Gradle поверх другого инструмента, почему?

IttayD
источник
6
Гугл запрыгнул с Gradle для Android SDK. developers.google.com/events/io/sessions/325236644 . Intellij теперь добавил поддержку Gradle. Это ставит gradle в основной поток (не только игрушечные проекты)
Jayan
Весенние артефакты теперь тоже создаются Gradle, я думаю, что Hibernate такой же.
Амир Пашазаде

Ответы:

248

Я сам не использую Gradle в гневе (пока только игрушечный проект) [автор означает, что они использовали Gradle только для игрушечного проекта, а не Gradle - игрушечный проект - см. Комментарии) , но я бы сказал, что причины, по которым его можно было бы рассмотреть, были из-за разочарований Муравья и Мавена.

По моему опыту, Ant часто только для записи (да, я знаю, что можно писать красиво модульные, элегантные сборки , но на самом деле большинство людей этого не делают). Для любых нетривиальных проектов это становится изнурительным и заботится о том, чтобы сложные сборки были действительно переносимыми. Его императивный характер может привести к репликации конфигурации между сборками (хотя здесь могут помочь макросы).

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

Механизм подключаемых модулей Maven обеспечивает очень мощные конфигурации сборки, а модель наследования означает, что вы можете определить небольшой набор родительских POM, инкапсулирующих ваши конфигурации сборки для всего предприятия, и отдельные проекты могут наследовать эти конфигурации, оставляя их легковесными. Конфигурация Maven очень многословна (хотя Maven 3 обещает решить эту проблему), и если вы хотите сделать что-то «не так, как Maven», вы должны написать плагин или использовать хакерскую интеграцию Ant. Обратите внимание, что мне нравится писать плагины Maven, но я понимаю, что многие будут возражать против прилагаемых усилий.

Градл обещает попасть в сладкое место между Муравьем и Мейвеном. Он использует подход Айви для разрешения зависимостей. Это позволяет договориться о конфигурации, но также включает в себя задачи Ant как граждан первого класса. Это также мудро позволяет вам использовать существующие репозитории Maven / Ivy.

Так что, если вы попали и застряли с какими-либо болевыми точками Ant / Maven, вероятно, стоит попробовать Gradle, хотя, на мой взгляд, еще неизвестно, если бы вы просто не обменяли известные проблемы на неизвестные. Доказательство того, что пудинг есть в еде, поэтому я оставляю за собой суждение, пока продукт не станет немного более зрелым, а другие не сгладят изломы (они называют причину кровотечения по причине). Я все еще буду использовать его в своих игрушечных проектах, всегда полезно знать о вариантах.

Богатый продавец
источник
69
@ Том не говорил, что Gradle - это игрушечный проект, но я пока использовал его только в игрушечном проекте. Извините, что вас обманули
Богатый продавец
18
Слиер - несмотря на возраст, я отредактировал пост, чтобы уточнить, что разъясняется в комментариях - недоразумение сразу же окрашивает пост как анти-Gradle. Если кто-то, исследующий Gradle (как я), изначально неправильно понимает это вступительное предложение (как я), он может не читать дальше или читать поясняющий комментарий (как я почти сделал). Пожалуйста, отмените / отредактируйте мои изменения, если вы не согласны / не понравились.
Берт Ф.
48
Что бы это ни стоило, у меня не сложилось впечатления, что @RichSeller имел в виду, что Gradle вообще был для игрушечных проектов (даже до того, как прочитал часть в квадратных скобках).
Джек Лиу
2
Когда я прочитал «пока только игрушечный проект», у меня сразу сложилось впечатление, что автор имел в виду, что сам Gradle является игрушечным проектом, особенно после того, как я запутался в том, что «я сам не использую Gradle в гневе». Это говорит о том, что автор использует Gradle, когда не в гневе. Я предлагаю просто переписать первое целое предложение.
OSA
79

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

Прежде всего, Gradle - это инструмент программирования зависимостей, который также означает, что это инструмент программирования. С Gradle вы можете выполнить любую случайную задачу в вашей настройке, и Gradle обеспечит правильное и своевременное выполнение всех объявленных зависимостей. Ваш код может быть распределен по многим каталогам в любой форме (дерево, квартира, разбросаны, ...).

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

Помимо этих функций программирования зависимостей Gradle добавляет функции зависимостей проектов и JAR путем интеграции с Apache Ivy. Как вы знаете, Ivy - гораздо более мощный и гораздо менее самоуверенный инструмент управления зависимостями, чем, скажем, Maven.

Gradle обнаруживает зависимости между проектами, а также между проектами и JAR-файлами. Gradle работает с репозиториями Maven (загрузка и выгрузка), такими как iBiblio one или ваши собственные репозитории, но также поддерживает и другую инфраструктуру хранилищ, которая может у вас быть.

В многопроектных сборках Gradle адаптируется и адаптируется к структуре и архитектуре сборки. Вам не нужно адаптировать свою структуру или архитектуру к вашему инструменту сборки, как это требуется для Maven.

Грэдл изо всех сил старается не мешать вам, усилие, которое Мэйвен почти никогда не делает. Соглашение хорошо, но гибкость тоже. Gradle дает вам гораздо больше возможностей, чем Maven, но самое главное во многих случаях Gradle предложит вам безболезненный путь перехода от Maven.

Стивен Девиджвер
источник
64

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

Ant + ant-contrib по сути является полноценным языком программирования, который никто не хочет программировать.

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

  • Это следует за соглашением по конфигурации (аля Maven), но только в той степени, в которой вы хотите
  • Это позволяет вам писать гибкие пользовательские задачи, как в Ant
  • Он обеспечивает поддержку многомодульных проектов, превосходящую как Ant, так и Maven.
  • Он имеет DSL, который упрощает 80% и 20% возможный (в отличие от других инструментов сборки, которые делают 80% легкими, 10% возможными и 10% эффективными невозможными).

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

omnisis
источник
49

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

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

build.gradle:

apply plugin:'java'
task test{
  doFirst{
    ant.copy(toDir:'build/test-classes'){fileset dir:'src/test/extra-resources'}
  }
  doLast{
    ...
  }
}

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

Это надмножество Ant - вы можете использовать все задачи Ant в Gradle с более приятным, похожим на groovy-подобным синтаксисом, т.е.

ant.copy(file:'a.txt', toDir:"xyz")

или

ant.with{
  delete "x.txt"
  mkdir "abc"
  copy file:"a.txt", toDir: "abc"
}
piotrga
источник
35

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

С Gradle вы можете иметь гибкость Ant и строить по соглашению Maven. Например, тривиально продлить жизненный цикл обычной сборки своей собственной задачей. И вы не обязаны использовать соглашение, если вы не хотите. Groovy гораздо приятнее кодировать, чем XML. В Gradle вы можете определять зависимости между проектами в локальной файловой системе без необходимости публиковать артефакты для каждого из них в репозитории. Наконец, Gradle использует Ivy, поэтому он отлично управляет зависимостями. Пока что единственным реальным недостатком для меня является отсутствие зрелой интеграции Eclipse, но варианты для Maven не намного лучше.

ВСК
источник
2
Лично я считаю, что интеграция с Eclipse - это нормально. Установить его в Juno довольно просто.
Джангофан
1
Через 2 года после того, как автор написал этот ответ, хотя!
Денис
21

Это не мой ответ, но он определенно резонирует со мной. Это от технологического радара ThoughtWorks с октября 2012 года :

Две вещи вызвали усталость с инструментами сборки на основе XML, такими как Ant и Maven: слишком много злых заостренных скобок и грубость архитектур плагинов. Хотя проблемы с синтаксисом можно решать с помощью генерации, архитектуры подключаемых модулей серьезно ограничивают возможность изящного роста инструментов сборки по мере усложнения проектов. Мы почувствовали, что плагины - это неправильный уровень абстракции, и вместо этого предпочитаем языковые инструменты, такие как Gradle и Rake, потому что они предлагают более тонкие абстракции и большую гибкость в долгосрочной перспективе.

Эд Стауб
источник
16

Gradle вернул удовольствие в сборку / сборку программного обеспечения. Я использовал ant для создания программного обеспечения всю свою карьеру, и я всегда считал, что фактическая «buildit» часть работы разработчика - необходимое зло. Несколько месяцев назад наша компания устала от того, чтобы не использовать бинарное репо (то есть проверка jars в vcs), и мне было поручено исследовать это. Начал с плюща, так как его можно было прикрутить к муравью, и мне не повезло, что мои построенные артефакты были опубликованы так, как я хотел. Я выбрал Maven и взломал xml, великолепно поработал над несколькими простыми вспомогательными библиотеками, но столкнулся с серьезными проблемами, пытаясь связать приложения, готовые к развертыванию. Занимался долгое время поиском плагинов и чтением форумов, а также загрузил триллионы файлов поддержки для различных плагинов, которые мне было трудно использовать.

Но с первого дня мое настроение начало улучшаться. Я куда-то добирался. Мне понадобилось около двух часов, чтобы перенести мой первый модуль ant, и файл сборки был практически пустым. Легко устанавливается на один экран. Большое «вау» было: строить скрипты в xml, насколько это глупо? тот факт, что объявление одной зависимости занимает одну строку, очень привлекателен для меня -> вы можете легко увидеть все зависимости для определенного проекта на одной странице. С тех пор я был в постоянном движении, для каждой проблемы, с которой я сталкивался до сих пор, существует простое и элегантное решение. Я думаю, что это причины:

  • groovy очень интуитивно понятен для разработчиков Java
  • документация это здорово, чтобы здорово
  • гибкость бесконечна

Теперь я провожу свои дни, пытаясь придумать новые функции, которые можно добавить в наш процесс сборки. Насколько это больное?

Kalle
источник
+1 за "создание сценариев в XML, насколько это глупо?" В 2000 году XML считался самой крутой вещью в истории, поэтому, честно говоря, в то время он казался скорее модным, чем глупым. Языки программирования на основе XML - это, по сути, списки, потому что они имеют разделители открытия / закрытия для каждой команды. Но это супер-подробные версии lisp, в которых 4 символа кода становятся 40 символами. Это один из способов научиться печатать, но не моя чашка чая.
ГленПетерсон
8

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

Мы делаем Java с JNI и множеством других нативных битов. Gradle значительно упростил наш Ant Ant Mess. Когда мы начали внедрять управление зависимостями в нативные проекты, это было грязно. Мы заставили Maven сделать это, но эквивалентный код Gradle был крошечной частью того, что требовалось в Maven, и люди могли читать и понимать его, не становясь гуру Maven.

swpalmer
источник
3

Я частично согласен с Эдом Стаубом. Gradle определенно является более мощным по сравнению с Maven и обеспечивает большую гибкость в долгосрочной перспективе.

Проведя оценку для перехода от maven к gradle, мы решили придерживаться самого maven для решения двух проблем, с которыми мы столкнулись при работе с gradle (скорость ниже, чем у maven, прокси не работает).

жизни
источник
У меня были проблемы с прокси с v1.2, но с тех пор я думаю, что это работает. Таким образом, ctnlm или подобное приложение - решение для maven для решения проблем прокси NTLM. Gradle имеет эту поддержку из коробки. хотя это так тривиально, я удивляюсь, почему у Maven никогда не было этой поддержки «из коробки» для прокси на основе аутентификации NTLM.
skipy