Gradle є одним з декількох інструментів розробки Java, представлених у Посібнику глобального розробника Java Stackify, але це не єдиний інструмент автоматизації збірки, який слід враховувати. Maven є більш старою і більш часто використовуваною альтернативою, але яка система побудови найкраще. Чи підходить він для вашого проекту? Як і інші інструменти, такі як Весна, дозволяють розробляти для ботів, щоб вибрати між цими двома системами, в поєднанні зі зростаючою кількістю інтеграцій для обох, рішення в значній мірі залежить від вас.

Розмір вашого проекту, необхідність налаштування та деякі інші змінні можуть допомогти вам зробити вибір. Подивимося.

Що таке Gradle?

Gradle – це система автоматизації збірки, яка повністю відкрита і використовує концепції, які ви бачите в Apache Maven і Apache Ant. Він використовує конкретну мову на основі мови програмування Groovy, яка відрізняє її від Apache Maven, яка використовує XML для налаштування проекту. Він також визначає порядок виконання завдань за допомогою спрямованого ациклічного графіка.

Кілька розробників створили Gradle і вперше випустили його в 2007 році, а в 2013 році він був прийнятий Google як система побудови для проектів Android. Він був розроблений для підтримки багатопроектних великих збірок. Це також дозволяє доповнити збірку, оскільки знає, які частини вашого проекту оновлюються. Завдання, які залежать від оновлених частин, не повторюються. На даний момент останнім стабільним релізом є версія 3.4, яка вийшла в лютому 2017 року. Він підтримує розробку та розгортання за допомогою Java, Scala та Groovy, і в майбутньому буде представлено більше робочих процесів та мов.

Що таке Maven?

Maven використовується для автоматизації побудови проектів за допомогою Java. Він допомагає скласти схему складання конкретного програмного забезпечення, а також його різних залежностей. Він використовує XML-файл для опису проекту, який ви будуєте, залежностей програмного забезпечення від сторонніх модулів і деталей, порядку збірки та необхідних плагінів. Існують заздалегідь визначені цілі для таких завдань, як упаковка та компіляція.

Maven завантажує бібліотеки та плагіни з різних репозиторіїв, а потім кешує їх усі на вашому локальному комп’ютері. Хоча Maven в основному використовується для проектів Java, ви можете використовувати його для Scala, Ruby і C#, а також для безлічі інших мов.

Gradle в порівнянні з Maven

Є деякі фундаментальні відмінності в підході цих двох систем до збірки. Gradle базується на графіку залежності задач, в якому завдання – це те, що виконує роботу, тоді як Maven базується на фіксованій та лінійній фазовій моделі. У Maven цілі прив’язані до етапів проекту, а цілі виконують ту ж функцію, що і завдання в Gradle, будучи «елементами, які виконують роботу».

З точки зору продуктивності обидві програми дозволяють запускати багатомодульні збірки паралельно. Однак, Gradle дозволяє виконувати інкрементні збірки, оскільки перевіряє, які завдання оновлюються, а які ні. Якщо так, то завдання не вдається, даючи вам набагато менше часу на створення. Інші відмінні риси продуктивності, які можна знайти в Gradle, включають:

  • Інкрементна компіляція для класів Java
  • Уникнення компіляції для Java
  • Використання API для інкрементних підзавдань
  • Фонова служба компілятора, яка також значно прискорює компіляцію.

З точки зору управління залежностями, як Gradle, так і Maven можуть працювати з динамічними та перехідними залежностями, використовувати сторонні кеші залежностей та читати формат метаданих POM. Ви також можете оголошувати версії бібліотеки за допомогою центральних версій і надавати централізовані версії. Обидва продукти завантажують тимчасові залежності зі своїх репозиторіїв артефактів. Maven має Maven Central, а Gradle має JCenter, і ви можете визначити власний репозиторій компанії. Якщо потрібно кілька залежностей, Maven може завантажувати їх одночасно.

Gradle, однак, виграє, коли справа доходить до залежностей і реалізацій API, а також можливість безпечно кешувати в той же час. Він також зберігає метадані репозиторію разом із кешованими залежностями, гарантуючи, що два або більше проектів, що використовують один кеш, не перезаписують один одного, а також мають кеш на основі контрольної суми та можуть синхронізувати кеш зі сховищем. Крім того, Gradle сумісний з метаданими IVY, що дозволяє визначити власні правила для визначення версії для динамічної залежності та вирішення конфліктів версій. Ці функції недоступні в Maven.

Нижче наведено інші параметри керування залежностями, які можна знайти лише в Gradle:

  • Використання правил підстановки для сумісних бібліотек
  • Використання правил заміни
  • Краще управління метаданими
  • Можливість динамічно замінити дизайнерські залежності зовнішніми залежностями і навпаки.

Gradle також дозволяє легко працювати з композитними збірками, дозволяючи працювати зі спеціальними та постійними композитними збірками, а також об’єднувати різні збірки та імпортувати композитну збірку в Eclipse або IntelliJ IDEA.

Для моделей виконання обидва мають групи завдань і описи. Обидва дозволяють будувати тільки зазначений проект і його залежності. Gradle, однак, має повністю настроюється DAG, в той час як в Maven мета може бути прив’язана тільки до однієї іншої мети. Кілька цілей мають форму впорядкованого списку. Gradle також дозволяє виключати завдання, робити тимчасові винятки та визначати залежності між завданнями. У порівнянні з іншими рішеннями, Gradle також має розширені можливості для організації завдань і фіналізаторів.

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

Зразки коду

У порівнянні з Ant, Gradle і Maven, Нареш Джоші порівнює код, необхідний для створення сценарію збірки, який компілює, виконує статичний аналіз, запускає модульні тести і створює JAR-файли на сайті Програмування Mitra.

Ось код, необхідний для досягнення цієї мети з Maven:

<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">

<modelVersion>4.0.0</modelVersion>
<groupId>com.programming.mitra</groupId>
<artifactId>java-build-tools</artifactId>
<packaging>jar</packaging>
<version>1.0</version>

<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
</dependency>
</dependencies>

<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3.2</version>
</plugin>
</plugins>
</build>
</project>

Щоб запустити завдання Maven, яке створює файл JAR, виконайте такі дії:

mvn package

Зауважте, що за допомогою цього коду ви вказуєте параметри, але не вказуєте завдання, які слід виконати. Ви можете додати плагіни (такі як Maven CheckStyle, FindBugs і PMD) для виконання статичного аналізу як єдиної мети разом з модульними тестами, але ви хочете вказати шлях до користувацької конфігурації стилю перевірки, щоб переконатися, що вона не буде працювати на помилку за допомогою коду, такого як:

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-checkstyle-plugin</artifactId>
<version>2.12.1</version>
<executions>
<execution>
<configuration>
<configLocation>config/checkstyle/checkstyle.xml</configLocation>
<consoleOutput>true</consoleOutput>
<failsOnError>true</failsOnError>
</configuration>
<goals>
<goal>check</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>findbugs-maven-plugin</artifactId>
<version>2.5.4</version>
<executions>
<execution>
<goals>
<goal>check</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-pmd-plugin</artifactId>
<version>3.1</version>
<executions>
<execution>
<goals>
<goal>check</goal>
</goals>
</execution>
</executions>
</plugin>

Щоб виконати завдання для досягнення цієї мети, виконайте такі дії:

mvn verify

Деякі основні і загальні завдання вимагають досить багато XML, і з цієї причини проекти в Maven з великою кількістю завдань і залежностей можуть призвести до pom.xml файлів, що складаються з сотень і тисяч рядків коду.

Для порівняння, ось приклад коду, який досягає аналогічного результату:build.gradle

apply plugin:'java'
apply plugin:'checkstyle'
apply plugin:'findbugs'
apply plugin:'pmd'

version ='1.0'

repositories {
    mavenCentral()
}

dependencies {
    testCompile group:'junit', name:'junit', version:'4.11'
}

Цей код коротший, а також вводить деякі корисні завдання, які не охоплюються кодом Maven вище. Щоб отримати список завдань, які Gradle може виконувати з поточною конфігурацією, виконайте такі дії:

gradle tasks --all

Як вибрати?

В цілому, обидва інструменти мають свої сильні і слабкі сторони.

  • Окремі збірки. За допомогою Maven ви можете легко визначити метадані та залежності вашого проекту, але створення дуже налаштованої збірки може стати кошмаром для користувачів Maven. Файл POM може легко набухати в міру зростання проекту, а потім перетворюватися в нечитабельний XML-файл.
  • Управління залежностями та структура каталогів. Однак Maven забезпечує просте, але ефективне управління залежностями, і оскільки він має структуру каталогів для ваших проектів, у вас є свого роду стандартна схема для всіх ваших проектів. Він використовує декларативний XML-файл для свого файлу POM і має багато плагінів, які ви можете використовувати. Gradle використовує структуру каталогів, яку ви бачите в Maven, але її можна налаштувати. Він також використовує той же формат GAV, який Maven використовує для ідентифікації артефактів.
  • Плагіни та інтеграції. Maven також підтримує широкий спектр етапів життєвого циклу збірки та легко інтегрується зі сторонніми інструментами, такими як CI-сервери, плагіни для покриття коду, системи репозиторію артефактів тощо Що стосується плагінів, кількість доступних плагінів в даний час зростає, і є основні постачальники, які мають плагіни, сумісні з Gradle. Однак кількість доступних плагінів для Maven все ще більша, ніж для Gradle.
  • Гнучкість. Gradle, з іншого боку, дуже гнучкий і заснований на сценарії. Користувацькі збірки було б легко зробити на Gradle. Однак, оскільки Gradle майже новий, кількість розробників, які знають Gradle зсередини, може бути обмежена.

В кінцевому рахунку, вибір буде залежати в першу чергу від того, що вам потрібно. Градл більш потужний. Однак трапляється так, що вам не потрібні більшість функцій і функцій, які він пропонує. Maven може підходити для невеликих проектів, а Gradle для великих.