Gradle
?
система автоматической сборки
, построенная на принципах
Apache Ant
и
Apache Maven
, но предоставляющая
DSL
на языках
Groovy
и
Kotlin
вместо традиционной
XML
-образной формы представления конфигурации проекта.
В отличие от
Apache Maven
, основанного на концепции жизненного цикла проекта, и
Apache Ant
, в котором порядок выполнения задач (targets) определяется отношениями зависимости (depends-on), Gradle использует
направленный ациклический граф
для определения порядка выполнения задач.
Gradle был разработан для расширяемых многопроектных сборок, и поддерживает
каскадную (waterfall) модель разработки
, определяя, какие компоненты дерева сборки не изменились и какие задачи, зависимые от этих частей, не требуют перезапуска.
Основные
плагины
предназначены для разработки и развертывания
Java
,
Groovy
и
Scala
приложений, но есть плагины для других
языков программирования
:
C++
,
Swift
,
Kotlin
а также
Spring
-проект с помощью Spring Boot.
Имеет свой собственный Gradle Daemon
[7]
- фоновый процесс для ускорения сборки проекта.
Рассмотрим пример проекта, в котором используется стандартная структура
каталогов
Maven
для исходных кодов и ресурсов.
Такая структура включает в себя следующие каталоги:
- src/main/java,
- src/main/resources,
- src/test/java,
- src/test/resources.
- Создаем эти файлы java-проекта через запуск команды в каталоге проекта:
gradle init
- Выбираем "Тип проекта" : application - вводим 2
- Выбираем "Язык проекта" : java - вводим 3
- Совместный проект или разделенный - вводим 1
- Выбираем "Язык DSL" : groovy - вводим 1
- Выбираем "тестовый фреймворк проекта" : JUnit 4 - вводим 1
- Вводим название проекта и пакета(на пример: mainProject).
Всё! Проект создан и теперь его можно открыть в любой IDE и работать непосредственно со сформированными каталогами и файлами.
Найдём сборочный файл Gradle нашего проекта по пути
/app/build.gradle:
plugins
{
// Apply the application plugin to add support for building a CLI application in Java.
id
'application'
}
repositories
{
// Use Maven Central for resolving dependencies.
mavenCentral
()
}
dependencies
{
// Use JUnit test framework.
testImplementation
'junit:junit:4.13.1'
// This dependency is used by the application.
implementation
'com.google.guava:guava:30.0-jre'
}
application
{
// Define the main class for the application.
mainClass
=
'mainProject.App'
}
Соберем проект через команду
gradle build:
> gradle build
:compileJava
:processResources
:classes
:jar
:assemble
:compileTestJava
:processTestResources
:testClasses
:test
:check
:build
BUILD SUCCESSFUL
Готовый jar-файл будет лежать в
/app/build/libs:
app.jar
Очистим собранные файлы командой:
gradle clean
Чтобы выполнить этот jar-файл из командной строки, добавим в файл
build.gradle
эти строки (версию java и наш Main-class):
java
{
sourceCompatibility
=
JavaVersion
.
VERSION_1_8
targetCompatibility
=
JavaVersion
.
VERSION_1_8
}
jar
{
manifest
{
attributes
(
'Main-Class'
:
'mainProject.App'
)
}
}
Снова собираем проект командой
gradle build
-> переходим в каталог
/app/build/libs
и набираем:
java -cp . -jar app.jar
Мы должны увидеть приветствие "Hello, World!".
Посмотреть все задачи можно через команду:
gradle tasks
Посмотреть все зависимости дочернего проекта app можно через команду:
gradle app:dependencies
Java
плагин
эмулирует жизненные циклы
Maven
, в виде задач в
направленном ациклическом графе
зависимостей для входов и выходов каждой задачи. В этом примере выполнение задачи
build
зависит от результата выполнения задач
check
и
assemble
. Также задача
check
зависит от
test
, а
assemble
от
jar
.
Gradle также позволяет использовать для проектов структуру каталогов, отличающуюся от конвенции
Maven
. В следующем примере будет рассмотрен проект, в котором исходный код находится в каталоге
src/java
, а не в
src/main/java
.
build.gradle
apply
plugin:
'java'
sourceSets
{
main
{
java
{
srcDirs
=
[
'src/java'
]
}
}
}
Для приложений, состоящих из модулей, удобно использовать
мультипроектный
подход Gradle:
- Каждый модуль расположен в своей отдельной директории.
- Каждый модуль может включать дочерние, которые будут расположены во вложенных директориях.
- Описание мультипроектной структуры выполняется в settings.gradle в корневой директории проекта.
- В корневой директории проекта есть build.gradle, который может настраивать себя и дочерние модули.
- Каждый дочерний модуль может иметь такие же два файла для настройки себя и своих дочерних модулей.
- Такой подход позволяет удобно запускать задачи для конкретных модулей или всего проекта в целом.
- Выполнение задач на этапе сборки (
тестирование, отчеты, логирование и т.д / походы в (сеть | сервисы), в общем, все, что умеет любое приложение
)
- Сборка зависимых библиотек проекта для билда, распределение степени доступа (как модификаторы доступа в языках программирования) внутри исполняющегося кода
app
/
build
.
gradle
.
kts
// Блок, отвечающий за подключение плагинов
plugins
{
id
(
"org.jetbrains.kotlin.jvm"
)
version
"1.4.31"
application
}
// Основные репозитории, из которых скачиваются плагины
repositories
{
mavenCentral
()
}
// Зависимости для вашего проекта
dependencies
{
implementation
(
platform
(
"org.jetbrains.kotlin:kotlin-bom"
))
// пример подключения плагина в ваш проект
implementation
(
"org.jetbrains.kotlin:kotlin-stdlib-jdk8"
)
implementation
(
"com.google.guava:guava:30.1-jre"
)
testImplementation
(
"org.jetbrains.kotlin:kotlin-test"
)
testImplementation
(
"org.jetbrains.kotlin:kotlin-test-junit"
)
}
// Основной класс для запуска программы
application
{
mainClass
.
set
(
"demo.AppKt"
)
}
- Muschko, B. and Dockter, H.
Gradle in Action. ? Manning Publications Company, 2013. ? 456 p. ?
ISBN 9781617291302
.
- Berglund, T.
Gradle Beyond the Basics. ? O'Reilly Media, 2013. ? 80 p. ?
ISBN 9781449373825
.
- Berglund, T. and McCullough, M.
Building and Testing with Gradle. ? O'Reilly Media, 2011. ? 110 p. ?
ISBN 9781449304638
.
- Kousen, K.
Gradle for Android. ? O'Reilly Media, Incorporated, 2015. ? 120 p. ?
ISBN 9781491947029
.
- Ikkink, H. K.
Gradle Effective Implementation Guide
. ? Packt Publishing, 2012. ? 350 p. ?
ISBN 9781849518116
.