Gradle

Gradle — система автоматической сборки, построенная на принципах Apache Ant и Apache Maven, но предоставляющая DSL на языках Groovy и Kotlin вместо традиционной XML-образной формы представления конфигурации проекта.

Gradle
Логотип программы Gradle
Тип система сборки[вд]
Разработчики Gradle Inc.[вд], Adam Murdoch[вд][3], Daz DeBoer[вд][4] и Bo Zhang[вд][4]
Написана на Java, Groovy[5] и Kotlin
Операционная система кроссплатформенность
Первый выпуск 2008[1]
Аппаратная платформа Java Virtual Machine
Последняя версия
Репозиторий github.com/gradle/gradle
Состояние активное
Лицензия Apache License 2.0[6]
Сайт gradle.org (англ.)
Логотип Викисклада Медиафайлы на Викискладе

В отличие от Apache Maven, основанного на концепции жизненного цикла проекта, и Apache Ant, в котором порядок выполнения задач (targets) определяется отношениями зависимости (depends-on), Gradle использует направленный ациклический граф для определения порядка выполнения задач.

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

Основные плагины предназначены для разработки и развертывания Java, Groovy и Scala приложений, но есть плагины для других языков программирования: C++, Swift, Kotlin а также Spring-проект с помощью Spring Boot.

Имеет свой собственный Gradle Daemon [7] - фоновый процесс для ускорения сборки проекта.

Пример проекта для Java

править
 

Рассмотрим пример проекта, в котором используется стандартная структура каталогов Maven для исходных кодов и ресурсов.

Такая структура включает в себя следующие каталоги:

  • src/main/java,
  • src/main/resources,
  • src/test/java,
  • src/test/resources.
  1. Создаем эти файлы java-проекта через запуск команды в каталоге проекта: gradle init
  2. Выбираем "Тип проекта" : application - вводим 2
  3. Выбираем "Язык проекта" : java - вводим 3
  4. Совместный проект или разделенный - вводим 1
  5. Выбираем "Язык DSL" : groovy - вводим 1
  6. Выбираем "тестовый фреймворк проекта" : JUnit 4 - вводим 1
  7. Вводим название проекта и пакета(на пример: 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

править

Посмотреть все задачи можно через команду: 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:

  1. Каждый модуль расположен в своей отдельной директории.
  2. Каждый модуль может включать дочерние, которые будут расположены во вложенных директориях.
  3. Описание мультипроектной структуры выполняется в settings.gradle в корневой директории проекта.
  4. В корневой директории проекта есть build.gradle, который может настраивать себя и дочерние модули.
  5. Каждый дочерний модуль может иметь такие же два файла для настройки себя и своих дочерних модулей.
  6. Такой подход позволяет удобно запускать задачи для конкретных модулей или всего проекта в целом.

Основные задачи

править

- Выполнение задач на этапе сборки (тестирование, отчеты, логирование и т.д / походы в (сеть | сервисы), в общем, все, что умеет любое приложение)

- Сборка зависимых библиотек проекта для билда, распределение степени доступа (как модификаторы доступа в языках программирования) внутри исполняющегося кода

Основная структура 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.

Примечания

править