Модульность и многомодульные проекты в Gradle
Gradle поддерживает многомодульные проекты, позволяя организовать проект в виде иерархии подмодулей, каждый из которых имеет собственный build.gradle или build.gradle.kts. Это обеспечивает модульность, разделение ответственности и повторное использование кода.
Преимущества:
Разделение функциональности на независимые модули (например, API, ядро, реализация).
Упрощение тестирования и поддержки.
Параллельная сборка модулей для повышения производительности.
Повторное использование конфигураций и зависимостей.
settings.gradle(.kts) — управление include-проектами
Файл settings.gradle (или settings.gradle.kts) определяет структуру многомодульного проекта, включая корневое имя и подмодули.
Основные функции:
Указание имени корневого проекта: rootProject.name.
Включение подмодулей через include.
Настройка репозиториев и плагинов через pluginManagement.
Пример (Groovy DSL):
Kotlin DSL:
Нюансы:
Структура multi-module проекта: Parent + Children
Многомодульный проект состоит из корневого (parent) проекта и подмодулей (children), каждый из которых имеет собственный build.gradle.
Пример структуры:
Parent проект:
Корневой build.gradle задает общие настройки, плагины и зависимости для всех подмодулей.
Пример:
Children проекты:
Каждый подмодуль имеет собственный build.gradle, определяющий специфические задачи, зависимости и конфигурации.
Пример (module-api/build.gradle):
В памяти: Корневой проект загружает модель для всех подмодулей, включая их задачи и зависимости. Каждый подмодуль добавляет объект Project и граф задач, увеличивая потребление памяти.
Для оптимизации используйте --configure-on-demand:
Project Access: project(":module")
Подмодули доступны через объект project с использованием их пути, определенного в settings.gradle.
Пример:
Это добавляет module-core как зависимость для текущего модуля.
Нюансы:
Путь начинается с : для корневого проекта (например, :module-core:submodule для вложенных модулей).
Доступ к свойствам другого модуля:println project(':module-core').version
#Java #middle #Gradle #Task #include_projects
Gradle поддерживает многомодульные проекты, позволяя организовать проект в виде иерархии подмодулей, каждый из которых имеет собственный build.gradle или build.gradle.kts. Это обеспечивает модульность, разделение ответственности и повторное использование кода.
Преимущества:
Разделение функциональности на независимые модули (например, API, ядро, реализация).
Упрощение тестирования и поддержки.
Параллельная сборка модулей для повышения производительности.
Повторное использование конфигураций и зависимостей.
В памяти: Каждый модуль создает собственный объект Project в модели Gradle, увеличивая потребление памяти пропорционально количеству модулей (обычно 50-100 МБ на модуль). Граф задач (DAG) для всех модулей хранится в памяти, что может достигать 1-2 ГБ для крупных проектов.
settings.gradle(.kts) — управление include-проектами
Файл settings.gradle (или settings.gradle.kts) определяет структуру многомодульного проекта, включая корневое имя и подмодули.
Основные функции:
Указание имени корневого проекта: rootProject.name.
Включение подмодулей через include.
Настройка репозиториев и плагинов через pluginManagement.
Пример (Groovy DSL):
rootProject.name = 'my-project'
include 'module-api', 'module-core', 'module-web'
Kotlin DSL:
rootProject.name = "my-project"
include("module-api", "module-core", "module-web")
Нюансы:
Каждый подмодуль должен иметь собственный build.gradle в папке с таким же именем (например, module-api/build.gradle).
Подмодули могут быть вложенными:include 'module-core:submodule'
В памяти: settings.gradle загружается на фазе инициализации, создавая модель проекта с объектами Project для каждого модуля. Это минимальная фаза по потреблению памяти (50-100 МБ), но сложные настройки (например, pluginManagement) могут увеличить overhead.
Структура multi-module проекта: Parent + Children
Многомодульный проект состоит из корневого (parent) проекта и подмодулей (children), каждый из которых имеет собственный build.gradle.
Пример структуры:
my-project/
├── build.gradle
├── settings.gradle
├── module-api/
│ └── build.gradle
├── module-core/
│ └── build.gradle
├── module-web/
│ └── build.gradle
Parent проект:
Корневой build.gradle задает общие настройки, плагины и зависимости для всех подмодулей.
Пример:
allprojects {
repositories {
mavenCentral()
}
}
subprojects {
apply plugin: 'java'
dependencies {
testImplementation 'junit:junit:4.13.2'
}
}
Children проекты:
Каждый подмодуль имеет собственный build.gradle, определяющий специфические задачи, зависимости и конфигурации.
Пример (module-api/build.gradle):
plugins {
id 'java-library'
}
dependencies {
api 'org.apache.commons:commons-lang3:3.12.0'
}
В памяти: Корневой проект загружает модель для всех подмодулей, включая их задачи и зависимости. Каждый подмодуль добавляет объект Project и граф задач, увеличивая потребление памяти.
Для оптимизации используйте --configure-on-demand:
./gradlew build --configure-on-demand
Project Access: project(":module")
Подмодули доступны через объект project с использованием их пути, определенного в settings.gradle.
Пример:
dependencies {
implementation project(':module-core')
}
Это добавляет module-core как зависимость для текущего модуля.
Нюансы:
Путь начинается с : для корневого проекта (например, :module-core:submodule для вложенных модулей).
Доступ к свойствам другого модуля:println project(':module-core').version
В памяти: Gradle хранит все объекты Project в памяти, обеспечивая доступ через project(). Это увеличивает модель проекта, особенно для больших иерархий модулей.
#Java #middle #Gradle #Task #include_projects
👍2
Sharing Logic между проектами
Совместное использование логики между модулями повышает повторное использование кода и упрощает поддержку.
Common Logic
В корневом build.gradle:
Используйте блоки allprojects и subprojects для общих настроек:
Скриптовые плагины:
Создайте файл common.gradle:
Подключите в подмодулях:
Кастомные плагины:
Создайте плагин для общей логики (см. раздел "Создание собственных плагинов" в предыдущей статье).
Пример применения:
Version Catalogs (libs.versions.toml)
Version Catalogs — это централизованный способ управления версиями зависимостей и плагинов, введенный в Gradle 7.0.
Настройка (gradle/libs.versions.toml):
Использование:
Kotlin DSL:
Преимущества:
Централизованное управление версиями.
Улучшенная читаемость и автодополнение в IDE.
Упрощение обновления версий.
#Java #middle #Gradle #Task #include_projects
Совместное использование логики между модулями повышает повторное использование кода и упрощает поддержку.
Common Logic
В корневом build.gradle:
Используйте блоки allprojects и subprojects для общих настроек:
subprojects {
apply plugin: 'java'
version = '1.0.0'
repositories {
mavenCentral()
}
}
Скриптовые плагины:
Создайте файл common.gradle:
apply plugin: 'java'
dependencies {
testImplementation 'junit:junit:4.13.2'
}
Подключите в подмодулях:
apply from: "$rootDir/gradle/common.gradle"
Кастомные плагины:
Создайте плагин для общей логики (см. раздел "Создание собственных плагинов" в предыдущей статье).
Пример применения:
subprojects {
apply plugin: 'com.example.common-plugin'
}
В памяти: Общая логика уменьшает дублирование кода, но увеличивает сложность модели проекта, так как Gradle загружает и парсит дополнительные скрипты или плагины.
Version Catalogs (libs.versions.toml)
Version Catalogs — это централизованный способ управления версиями зависимостей и плагинов, введенный в Gradle 7.0.
Настройка (gradle/libs.versions.toml):
[versions]
spring-boot = "2.7.18"
junit = "4.13.2"
[libraries]
spring-core = { group = "org.springframework", name = "spring-core", version.ref = "spring-boot" }
junit = { group = "junit", name = "junit", version.ref = "junit" }
[plugins]
spring-boot = { id = "org.springframework.boot", version.ref = "spring-boot" }
Использование:
plugins {
alias(libs.plugins.spring.boot)
}
dependencies {
implementation libs.spring.core
testImplementation libs.junit
}
Kotlin DSL:
plugins {
alias(libs.plugins.spring.boot)
}
dependencies {
implementation(libs.spring.core)
testImplementation(libs.junit)
}
Преимущества:
Централизованное управление версиями.
Улучшенная читаемость и автодополнение в IDE.
Упрощение обновления версий.
В памяти: Version Catalog загружается как часть модели проекта, добавляя минимальный overhead (10-20 МБ), но упрощает управление зависимостями, снижая вероятность конфликтов.
#Java #middle #Gradle #Task #include_projects
👍2