JavaOpt: Gradle

Gradle


Выполняет задачи по сборке в графе задач. Граф выстраивается применительно к lifecycle task. Можно создавать свои задачи, но существуют и стандартные:

  • clean
  • compile. Выполняет помиляцию для всех языков, также применяется фильтрация processResources
  • test. Unit тесты, а также все, что определено в test source set
  • package
  • verify. Всевозможные проверки, например, Checkstyle. Integration тесты выполняются тут же.
  • install. Выполняется публикация publishToMavenLocal
  • deploy. Публикация в публичном Maven. По умолчанию публикация исходников и JavaDoc не выполняется

gradle init

Создает скелет проекта посредством похожего диалога:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
Select type of project to generate:
1: basic
2: application
3: library
4: Gradle plugin
Enter selection (default: basic) [1..4] 2

Select implementation language:
1: C++
2: Groovy
3: Java
4: Kotlin
5: Scala
6: Swift
Enter selection (default: Java) [1..6] 3

Split functionality across multiple subprojects?:
1: no - only one application project
2: yes - application and library projects
Enter selection (default: no - only one application project) [1..2] 2

Select build script DSL:
1: Groovy
2: Kotlin
Enter selection (default: Groovy) [1..2] 1

Generate build using new APIs and behavior (some features may change in the next minor release)? (default: no) [yes, no] yes

Project name (default: TEST):

Source package (default: test):

Выполняется следующий

Gradle properties

Параметры для Gradle загружаются из следующих локаций и переписывают друг друга в указанной последовательности:

  • build script
  • gradle.properties
  • gradle.properties из $HOME/.gradle (точное расположение зависит от ОС)

Profiles

В Gradle нет такого понятия как профиль сборки (как, например, в Maven), но благодаря возможности управления сборкой кодом, это доступно. Так, достаточно определить несколько Gradle скриптов, которые будут определять действия согласно требованиям “профиля” (profile-default.gradle, profile-test.gradle, profile-highload.gradle, profile-production.gradle). Затем, достаточно подключать указанные Gradle посредством проверки условий. Наприме так:

title
1
2
3
4
5
6
7
if(!hasProperty("buildProfile")) ext.activeProfile = "default"
apply from: "profile-${activeProfile}.gradle"
task.register("greeting") {
doLast {
println welcomeMessage
}
}
title
1
ext.welcomeMessage = "Default welcome"
title
1
ext.welcomeMessage = "Test welcome"
title
1
ext.welcomeMessage = "Highload welcome"
title
1
ext.welcomeMessage = "Production welcome"

Вызов gradle greeting выдаст Default welcome, но если будет указан параметр псевдо-профиля gradle -PbuildProfile=highload greeting, то будет выдано Highload welcome.

Можно использовать не только параметры, но и системные переменные, внешние переменные (загруженные из внешнего ресурса, например, etcd).
Однако, Gradle комьюнити не рекомендует использовать подобный подход (через профили), т.к. это усложняет понимание сборочного процесса. В частности, рекомендуемым подходом является Build Types, Product Flavors и Build Variants концепции.

Gradle Repository

Gradle требует указания хотя бы 1 репозитория. Указания mavenLocal всегда безопасно.

Integration test

Явного блока с интеграционными тестами не предусмотрено, можно создать его самостоятельно - достаточно добавить исходные коды в качестве source set для тестов (рекомендовано хранить их отдельно), отключение всех сторонних компонентов можно выполнить в блоке finalizedBy.
Интеграционные тесты не всегда являются необходимыми для успешных проверок, так что обязательность для гарантий их успешного выполнения можно отключить: test.ignoreFailures.

Build blocks

Process resources

С помощью данного блока можно управлять ресурсами, участвующими в сборке (по ум., находятся в src/main/resources). Так, можно фильтровать их (с помощью exclude)

1
2
3
4
processResources {
exclude("**/do-not-publish.json")
exclude("my-private-resource/**")
}

Dependencies

Gradle требует указания группы, артефакта и версии.

implementation platform и implementation enforcedPlatform

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

1
implementation platform("org.springframework.boot:spring-boot-dependencies:3.2.0")

Это позволит загрузить все связанные c Spring Boot библиотеки именно тех версий, которые определены в POM и не указывать их принудительно:

1
2
implementation "org.springframework.boot:spring-boot-starter-web"
implementation "org.springframework.boot:spring-boot-starter-data-jpa"

Команда mustRunAfter

Определяет, что целевая задача должна быть выполнена после указанной задачи(задач):

1
test.mustRunAfter checkstyleMain, checkstyleTest
 Comments
Comment plugin failed to load
Loading comment plugin