Java for Beginner
699 subscribers
611 photos
166 videos
12 files
954 links
Канал от новичков для новичков!
Изучайте Java вместе с нами!
Здесь мы обмениваемся опытом и постоянно изучаем что-то новое!

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

Наш канал на RUTube - https://rutube.ru/channel/37896292/
Download Telegram
Зависимости и конфигурации в Gradle

Dependency
Configurations
Конфигурации в Gradle определяют группы зависимостей, используемых для разных целей (компиляция, выполнение, тестирование). Они заменяют концепцию scope в Maven, предоставляя более гибкий подход.


Основные конфигурации

implementation:
Используется для зависимостей, необходимых для компиляции и выполнения кода проекта.
Не транзитивны для потребителей (в отличие от api).


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

Использование: Для внутренних зависимостей, которые не должны быть видны внешним модулям.


api:
Используется для зависимостей, которые становятся частью публичного API модуля и транзитивно передаются потребителям.
Применяется в основном в плагине java-library.


Пример:
plugins {
id 'java-library'
}
dependencies {
api 'org.apache.commons:commons-lang3:3.12.0'
}

Использование: Для библиотек, которые должны быть доступны в classpath потребителей (например, интерфейсы или DTO).


compileOnly:
Зависимости, необходимые только для компиляции, но не для выполнения.
Аналог provided в Maven.

Пример:
dependencies {
compileOnly 'javax.servlet:javax.servlet-api:4.0.1'
}

Использование: Для API, предоставляемых контейнером (например, Servlet API в веб-приложениях).


runtimeOnly:
Зависимости, необходимые только для выполнения, но не для компиляции.
Аналог runtime в Maven.


Пример:
dependencies {
runtimeOnly 'mysql:mysql-connector-java:8.0.28'
}

Использование: Для драйверов баз данных или библиотек, используемых только во время выполнения.


testImplementation:
Зависимости для компиляции и выполнения тестов.
Не транзитивны для основного кода.


Пример:
dependencies {
testImplementation 'junit:junit:4.13.2'
}

Использование: Для тестовых фреймворков и библиотек.


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


Конфигурации в деталях: configurations {}
Gradle позволяет определять кастомные конфигурации через блок configurations для специфических нужд.

Пример:
configurations {
customConfig
}
dependencies {
customConfig 'com.example:library:1.0'
}
tasks.register('useCustomConfig') {
doLast {
configurations.customConfig.each { file ->
println "Using ${file.name}"
}
}
}

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


Расширение конфигураций: Конфигурации могут наследовать друг от друга:
configurations {
customConfig.extendsFrom implementation
}

Это добавляет все зависимости implementation в customConfig.


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


#Java #middle #Gradle #Configuration_gradle
👍3
Dependency Resolution

Gradle автоматически разрешает зависимости, загружая их из репозиториев (например, Maven Central) и управляя конфликтами версий.


Версионирование, конфликты, форсинг, exclusions

Версионирование:
Зависимости указываются с версией: group:artifact:version.
Поддерживаются динамические версии (например, 1.+) или диапазоны ([1.0,2.0)).


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


Конфликты:
Gradle использует стратегию newest-wins (новейшая версия побеждает) для разрешения конфликтов версий.
Пример: Если модуль A требует spring-core:5.3.20, а модуль B — spring-core:5.3.22,
Gradle выберет 5.3.22.

В памяти: Gradle строит граф зависимостей и разрешает конфликты во время фазы конфигурации, храня временные структуры для сравнения версий.


Форсинг:

Для принудительного использования конкретной версии используйте force:
configurations.all {
resolutionStrategy {
force 'org.springframework:spring-core:5.3.20'
}
}

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


Exclusions:
Исключение транзитивных зависимостей для избежания конфликтов или ненужных библиотек:
dependencies {
implementation('org.springframework:spring-core:5.3.20') {
exclude group: 'commons-logging'
}
}


В памяти: Исключения уменьшают размер графа зависимостей, снижая потребление памяти и вероятность конфликтов.



BOM (Bill of Materials)

BOM — это файл, определяющий согласованные версии зависимостей, аналогично Maven. Gradle поддерживает BOM через платформы (platform).

Пример:
dependencies {
implementation platform('org.springframework.boot:spring-boot-dependencies:2.7.18')
implementation 'org.springframework.boot:spring-boot-starter'
}


Как работает:
BOM импортируется как платформа, предоставляя версии для всех зависимостей без необходимости их указания.
Gradle загружает BOM (POM-файл) из репозитория и применяет его версии к зависимостям.

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



Модули и классы зависимостей

Модули: Gradle поддерживает зависимости от других Gradle-проектов (модулей) в многомодульных проектах:
dependencies {
implementation project(':module-core')
}


Модули добавляются в settings.gradle:include 'module-core', 'module-api'


Классы зависимостей: Gradle разрешает зависимости до уровня JAR-файлов, включаемых в classpath. Для Java-проектов это управляется плагином java или java-library.

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



Dependency Cache и Offline режим

Dependency Cache:
Gradle кэширует зависимости в ~/.gradle/caches/modules-2.
Кэш включает JAR-файлы, POM-файлы и метаданные, что минимизирует сетевые запросы.
Очистка кэша:rm -rf ~/.
gradle/caches

Offline режим:
Запустите Gradle с флагом --offline:./gradlew build --offline
Gradle использует только локальный кэш, что полезно для сборок без интернета.
Нюанс: Если зависимость отсутствует в кэше, сборка завершится с ошибкой.


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



#Java #middle #Gradle #Configuration_gradle
👍3
Lockfiles (Dependency Locking)

Lockfiles фиксируют точные версии зависимостей для воспроизводимости сборки.

Включение:
dependencyLocking {
lockAllConfigurations()
}


Генерация:
./gradlew dependencies --write-locks


Создает файлы gradle.lockfile в gradle/ для каждой конфигурации.

Пример lockfile:
org.springframework:spring-core:5.3.20
org.junit:junit:4.13.2

Использование: Gradle использует версии из lockfile, игнорируя динамические версии или новейшие доступные.


В памяти: Lockfiles загружаются как часть модели зависимостей, добавляя минимальный overhead. Они уменьшают время разрешения зависимостей, так как Gradle не проверяет удаленные репозитории.


Gradle Dependency Report (gradle dependencies)

Команда ./gradlew dependencies генерирует отчет о зависимостях для всех конфигураций:
./gradlew dependencies


Вывод (пример):
implementation - Implementation dependencies for the main source set.
\--- org.springframework:spring-core:5.3.20
\--- commons-logging:commons-logging:1.2
testImplementation - Implementation dependencies for the test source set.
\--- junit:junit:4.13.2


Флаги:
--configuration <name>: Для конкретной конфигурации, например, ./gradlew dependencies --configuration implementation.
-q: Для компактного вывода.


Использование: Анализ транзитивных зависимостей, выявление конфликтов.

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



Variant-aware Resolution

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

Пример:
dependencies {
implementation 'org.example:library:1.0' {
attributes {
attribute(TargetJvmVersion.TARGET_JVM_VERSION_ATTRIBUTE, 11)
}
}
}


Назначение:
Выбор артефакта для конкретной версии Java или платформы (например, Android vs JVM).
Поддержка мультиплатформенных библиотек (например, Kotlin Multiplatform).


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


#Java #middle #Gradle #Configuration_gradle
👍3