Java for Beginner
716 subscribers
659 photos
174 videos
12 files
1.03K links
Канал от новичков для новичков!
Изучайте Java вместе с нами!
Здесь мы обмениваемся опытом и постоянно изучаем что-то новое!

Наш YouTube канал - https://www.youtube.com/@Java_Beginner-Dev

Наш канал на RUTube - https://rutube.ru/channel/37896292/
Download Telegram
Структура build-файла Gradle

Файл build.gradle (или build.gradle.kts) является основным конфигурационным файлом Gradle, определяющим, как собирать проект. Он состоит из ключевых блоков, которые задают плагины, репозитории, зависимости, задачи и конфигурации.

Основные элементы

Plugins:
Блок plugins определяет плагины, которые добавляют задачи, настройки и функциональность.

Пример (Groovy DSL):
plugins {
id 'java'
id 'org.springframework.boot' version '2.7.18'
}


Пример (Kotlin DSL):
plugins {
java
id("org.springframework.boot") version "2.7.18"
}


Плагины могут быть:
Core plugins (например, java, application): встроены в Gradle.
Community plugins: загружаются из репозиториев (например, Maven Central).


В памяти: Плагины загружаются как Java-классы в JVM, увеличивая потребление памяти пропорционально их зависимостям и сложности.


Repositories:
Указывают, откуда Gradle загружает зависимости и плагины (например, Maven Central, JCenter).

Пример:
repositories {
mavenCentral()
maven { url 'https://repo.example.com' }
}


В памяти: Gradle загружает метаданные репозиториев (POM-файлы, индексы) в память для разрешения зависимостей, что требует временного увеличения ресурсов.


Dependencies:
Определяют библиотеки и модули, необходимые проекту.


Пример:
dependencies {
implementation 'org.springframework:spring-core:5.3.20'
testImplementation 'junit:junit:4.13.2'
}


Конфигурации (например, implementation, testImplementation) определяют область видимости зависимостей (аналогично scope в Maven).
В памяти: Gradle строит граф зависимостей (Directed Acyclic Graph, DAG), хранящий метаданные каждой зависимости. Это увеличивает потребление памяти, особенно для крупных проектов.



Tasks:
Задачи — это атомарные единицы работы (например, компиляция, тестирование).

Пример кастомной задачи:
task hello {
doLast {
println 'Hello, Gradle!'
}
}


Задачи могут зависеть друг от друга через dependsOn:task build(dependsOn:
['test', 'jar']) {
doLast { println 'Building project' }
}


В памяти: Каждая задача представлена как объект в JVM, содержащий конфигурацию, зависимости и действия. Gradle хранит DAG задач в памяти, что увеличивает overhead для сложных проектов.


Configurations:
Конфигурации определяют группы зависимостей для разных целей (например, implementation для компиляции, testImplementation для тестов).

Пример:
configurations {
customConfig
}
dependencies {
customConfig 'com.example:library:1.0'
}


В памяти: Конфигурации хранятся как часть графа зависимостей, добавляя метаданные для каждой группы. Это увеличивает объем памяти, особенно при использовании кастомных конфигураций.


Пример полного build.gradle
plugins {
id 'java'
id 'org.springframework.boot' version '2.7.18'
}
repositories {
mavenCentral()
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter'
testImplementation 'junit:junit:4.13.2'
}
tasks.register('customTask') {
doLast {
println 'Custom task executed'
}
}


В памяти: Файл build.gradle парсится в объектную модель, включающую плагины, зависимости и задачи. Groovy DSL требует загрузки Groovy-библиотек, а Kotlin DSL — Kotlin-библиотек, что увеличивает потребление памяти.


#Java #middle #Gradle #Build_gradle
👍4
Скриптовый движок (Groovy/Kotlin)

Gradle использует два языка для описания сборки:

Groovy DSL:
Основан на Groovy, динамически типизированном языке.
Преимущества: Простота, лаконичный синтаксис, широкая совместимость.
Недостатки: Ошибки могут обнаруживаться только на этапе выполнения из-за динамической типизации.


Пример:
dependencies {
implementation 'org.springframework:spring-core:5.3.20'
}


Kotlin DSL:
Основан на Kotlin, статически типизированном языке.
Преимущества: Автодополнение в IDE, раннее обнаружение ошибок, лучшая интеграция с Kotlin-проектами.
Недостатки: Более строгий синтаксис, требует знания Kotlin.


Пример:
dependencies {
implementation("org.springframework:spring-core:5.3.20")
}



В памяти: Groovy DSL компилируется динамически, загружая Groovy-библиотеки (например, groovy-all) в JVM, что увеличивает потребление памяти (около 50-100 МБ дополнительно). Kotlin DSL требует загрузки Kotlin-библиотек (kotlin-stdlib, kotlin-scripting), что добавляет аналогичный overhead, но статическая типизация снижает вероятность ошибок. Gradle кэширует результаты парсинга в ~/.gradle/caches для ускорения повторных сборок.



Gradle Project Object Model

Gradle Project Object Model (POM, не путать с Maven POM) — это внутренняя модель, представляющая проект в памяти.

Она включает:
Project: Корневой объект, содержащий свойства (group, name, version), задачи, зависимости и плагины.
Tasks: Объекты задач, связанные через DAG.
Dependencies: Граф зависимостей, организованный по конфигурациям.
Properties: Свойства проекта, доступные через ${
project.property}.
Subprojects: Для многомодульных проектов, каждый подпроект имеет свою модель.


Пример доступа:
println project.name
println project.version


В памяти: Gradle загружает модель проекта в JVM во время фазы конфигурации (см. ниже). Для многомодульных проектов каждый подпроект создает отдельную модель, увеличивая потребление памяти пропорционально количеству модулей. Кэширование метаданных в ~/.gradle/caches снижает повторные вычисления



Gradle Lifecycle Overview: Initialization → Configuration → Execution

Gradle выполняет сборку в три фазы:

Initialization:
Gradle загружает settings.gradle для определения структуры проекта (корневое имя, модули).
Создает объекты Project для корневого проекта и подпроектов.

В памяти: Загружаются settings.gradle и плагины, необходимые для инициализации. Это минимальная фаза по потреблению памяти.


Configuration:
Gradle парсит все build.gradle-файлы, создавая модель проекта и DAG задач.
Выполняются все скрипты конфигурации, даже для задач, которые не будут выполняться.
Пример: Определение зависимостей и задач в build.
gradle.
В памяти: Самая ресурсоемкая фаза, так как Gradle загружает и компилирует все скрипты, плагины и зависимости. Для крупных проектов может потребоваться несколько сотен МБ.


Execution:
Gradle выполняет задачи, указанные в командной строке (например, ./gradlew build), в порядке, определенном DAG.
Инкрементальность пропускает задачи, чьи входные/выходные данные не изменились.

В памяти: Зависит от сложности задач. Например, compileJava загружает исходные файлы и зависимости, а test — тестовые классы и фреймворки.


Нюансы:
Конфигурация выполняется всегда, даже если задачи не запускаются, что увеличивает время инициализации.
Используйте флаг --configure-on-demand для конфигурации только необходимых модулей:./gradlew build --configure-on-demand
Gradle Daemon сохраняет JVM между сборками, ускоряя повторные запуски, но увеличивая базовое потребление памяти.


#Java #middle #Gradle #Build_gradle
👍4