Java for Beginner
716 subscribers
660 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
Плагины и расширение функциональности в Gradle

Плагины в Gradle — это основной механизм расширения функциональности, позволяющий добавлять задачи, конфигурации и зависимости для автоматизации сборки. Они обеспечивают модульность и гибкость, позволяя адаптировать Gradle под конкретные проекты. Эта статья подробно описывает типы плагинов, встроенные и сторонние плагины, создание собственных плагинов, публикацию на Gradle
Plugin Portal, стратегии разрешения плагинов и управление через pluginManagement. Особое внимание уделяется внутренним механизмам, управлению памятью и нюансам.


Типы плагинов

Gradle поддерживает два основных типа плагинов: Script Plugins и Binary Plugins.

Script Plugin (apply from)
Описание: Скриптовые плагины — это файлы Gradle (обычно .gradle или .gradle.kts), которые содержат логику сборки и подключаются к build.gradle через apply from.

Пример (Groovy DSL):
apply from: 'other.gradle'


Содержимое other.gradle:
task customTask {
doLast {
println 'Custom task from script plugin'
}
}


Kotlin DSL:
apply(from = "other.gradle.kts")


Содержимое other.gradle.kts:
tasks.register("customTask") {
doLast {
println("Custom task from script plugin")
}
}


Использование: Для небольших проектов или повторно используемых фрагментов кода в рамках одного проекта.
В памяти: Скриптовые плагины парсятся как обычные Gradle-скрипты, добавляя задачи и конфигурации в модель проекта. Это увеличивает потребление памяти, аналогично основному build.gradle, но overhead минимален (10-50 МБ).



Binary
Plugin (apply plugin:)
Описание: Бинарные плагины — это скомпилированные Java/Groovy/Kotlin-классы, распространяемые как JAR-файлы. Они подключаются через apply plugin или блок plugins.

Пример (Groovy DSL):
apply plugin: 'java'


В памяти: Бинарные плагины загружаются как Java-классы в JVM, включая их зависимости. Это увеличивает потребление памяти пропорционально сложности плагина (50-200 МБ для крупных плагинов, таких как android).


plugins {} vs apply plugin:

plugins {}:
Современный способ подключения плагинов, введенный в Gradle 2.1.
Использует декларативный синтаксис и разрешает плагины из Gradle
Plugin Portal или репозиториев.

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


Kotlin DSL:
plugins {
java
id("org.springframework.boot") version "2.7.18"
}


Преимущества: Автоматическое разрешение версий, поддержка Gradle
Plugin Portal, меньшая вероятность ошибок.


apply plugin:
Традиционный способ, используемый в старых версиях Gradle.

Требует явного указания зависимости в buildscript:
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath 'org.springframework.boot:spring-boot-gradle-plugin:2.7.18'
}
}
apply plugin: 'org.springframework.boot'


Недостатки: Более многословный, требует ручного управления зависимостями.

В памяти: plugins {} использует внутренний механизм разрешения Gradle, минимизируя overhead по сравнению с buildscript, который загружает дополнительные зависимости в classpath.

Рекомендация: Используйте plugins {} для современных проектов, так как он проще и поддерживает автоматическое разрешение.


#Java #middle #Gradle #Task #Plugin
👍2
Built-in плагины

Gradle поставляется с набором встроенных плагинов, которые покрывают стандартные сценарии сборки.

java:
Добавляет задачи для компиляции, тестирования и упаковки Java-проектов (например, compileJava, test, jar).

Пример:
plugins {
id 'java'
}


В памяти: Загружает задачи и конфигурации (implementation, testImplementation), увеличивая модель проекта (50-100 МБ).


application:
Добавляет задачи для запуска Java-приложений (run, installDist).

Пример:
plugins {
id 'application'
}
application {
mainClass = 'com.example.Main'
}


В памяти: Добавляет задачи и classpath, минимально увеличивая overhead.


base:
Базовый плагин, добавляющий задачи жизненного цикла (clean, assemble, check).

Пример:
plugins {
id 'base'
}

В памяти: Легковесный, добавляет минимальное количество задач.


java-library:
Расширяет java, добавляя конфигурации api и implementation для библиотек.

Пример:

plugins {
id 'java-library'
}
dependencies {
api 'org.apache.commons:commons-lang3:3.12.0'
}

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


checkstyle:
Интегрирует проверку стиля кода с помощью Checkstyle.

Пример:
plugins {
id 'checkstyle'
}
checkstyle {
toolVersion = '8.45'
configFile = file('config/checkstyle/checkstyle.xml')
}

В памяти: Загружает конфигурацию Checkstyle и отчеты, увеличивая потребление памяти (50-100 МБ для крупных проектов).


maven-publish:

Позволяет публиковать артефакты в Maven-репозитории.

Пример:
plugins {
id 'maven-publish'
}
publishing {
publications {
mavenJava(MavenPublication) {
from components.java
}
}
repositories {
maven {
url 'https://nexus.example.com/repository/maven-releases'
}
}
}

В памяти: Загружает метаданные публикации и артефакты, увеличивая overhead при публикации.



#Java #middle #Gradle #Task #Plugin
👍2
Плагины для Kotlin, Android

Kotlin:
Плагин org.jetbrains.kotlin.jvm для JVM-проектов или org.jetbrains.kotlin.android для Android.

Пример:
plugins {
id 'org.jetbrains.kotlin.jvm' version '1.9.0'
}
dependencies {
implementation 'org.jetbrains.kotlin:kotlin-stdlib:1.9.0'
}

В памяти: Загружает Kotlin-компилятор и зависимости, добавляя 100-200 МБ overhead.


Android:

Плагин com.android.application или com.android.library для Android-проектов.

Пример:
plugins {
id 'com.android.application' version '8.1.0'
id 'org.jetbrains.kotlin.android' version '1.9.0'
}
android {
compileSdk 33
defaultConfig {
applicationId 'com.example.app'
minSdk 21
targetSdk 33
versionCode 1
versionName '1.0'
}
}

В памяти: Android-плагины загружают Android SDK, инструменты сборки (dexer, aapt2) и зависимости, что может потребовать 500-1000 МБ памяти.



Создание собственных плагинов

Собственные плагины позволяют кастомизировать сборку. Они могут быть написаны на Groovy, Kotlin или Java.

Плагин на Groovy

Создайте проект с структурой:
my-plugin/
├── src/main/groovy/com/example/MyPlugin.groovy
├── build.gradle


Реализуйте плагин:
package com.example
import org.gradle.api.Plugin
import org.gradle.api.Project

class MyPlugin implements Plugin<Project> {
void apply(Project project) {
project.tasks.register('myTask') {
doLast {
println 'Hello from MyPlugin!'
}
}
}
}


Настройте build.gradle:
plugins {
id 'groovy'
id 'maven-publish'
}
group = 'com.example'
version = '1.0'
publishing {
publications {
maven(MavenPublication) {
from components.java
}
}
}


Опубликуйте:
./gradlew publish.

В памяти: Groovy-плагины загружают Groovy-библиотеки, добавляя 50-100 МБ overhead.



Плагин на Kotlin

Создайте проект:
my-plugin/
├── src/main/kotlin/com/example/MyPlugin.kt
├── build.gradle.kts


Реализуйте плагин:
package com.example
import org.gradle.api.Plugin
import org.gradle.api.Project

class MyPlugin : Plugin<Project> {
override fun apply(project: Project) {
project.tasks.register("myTask") {
doLast {
println("Hello from MyPlugin!")
}
}
}
}


Настройте build.gradle.kts:
plugins {
`kotlin-dsl`
`maven-publish`
}
group = "com.example"
version = "1.0"
publishing {
publications {
create<MavenPublication>("maven") {
from(components["java"])
}
}
}


Опубликуйте:
./gradlew publish.

В памяти: Kotlin-плагины загружают Kotlin-библиотеки, добавляя 50-100 МБ overhead, но обеспечивают строгую типизацию.


Плагин на Java

Аналогично, но используйте Java-классы:
package com.example;
import org.gradle.api.Plugin;
import org.gradle.api.Project;

public class MyPlugin implements Plugin<Project> {
@Override
public void apply(Project project) {
project.getTasks().register("myTask", task -> {
task.doLast(t -> System.out.println("Hello from MyPlugin!"));
});
}
}

В памяти: Java-плагины легче, чем Groovy/Kotlin, так как не требуют дополнительных библиотек DSL.



Публикация плагина
Опубликуйте в локальный репозиторий:
./gradlew publishToMavenLocal


Используйте в другом проекте:
plugins {
id 'com.example.my-plugin' version '1.0'
}



#Java #middle #Gradle #Task #Plugin
👍2
Gradle Plugin Portal

Gradle Plugin Portal (plugins.gradle.org) — центральный репозиторий для публикации и загрузки плагинов.

Публикация:
Зарегистрируйтесь на plugins.gradle.org.
Получите API-ключ.


Настройте build.gradle:
plugins {
id 'com.gradle.plugin-publish' version '1.2.0'
}
pluginBundle {
plugins {
myPlugin {
id = 'com.example.my-plugin'
displayName = 'My Plugin'
description = 'A custom Gradle plugin'
tags = ['custom', 'example']
version = '1.0'
}
}
}


Опубликуйте:
./gradlew publishPlugins.


Использование:
plugins {
id 'com.example.my-plugin' version '1.0'
}

В памяти: Gradle Plugin Portal загружает метаданные плагинов в память при разрешении, добавляя небольшой overhead (10-50 МБ).


Plugin Resolution Strategy

Gradle разрешает плагины из репозиториев, указанных в pluginManagement или buildscript.

Стратегия разрешения:
Поиск: Gradle ищет плагин в Gradle Plugin Portal, Maven Central или пользовательских репозиториях.
Конфликты: Если плагин доступен в нескольких версиях, Gradle выбирает новейшую или указанную версию.


Настройка:
configurations.all {
resolutionStrategy {
force 'com.example:my-plugin:1.0'
}
}

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


pluginManagement в settings.gradle

Блок pluginManagement в settings.gradle позволяет централизованно управлять плагинами для всех модулей.

Пример:
pluginManagement {
repositories {
gradlePluginPortal()
mavenCentral()
}
plugins {
id 'org.springframework.boot' version '2.7.18'
}
}


Kotlin DSL:
pluginManagement {
repositories {
gradlePluginPortal()
mavenCentral()
}
plugins {
id("org.springframework.boot") version "2.7.18"
}
}


Назначение:
Указывает репозитории для плагинов.
Фиксирует версии плагинов для всех модулей.


Поддерживает кастомные разрешения:

pluginManagement {
resolutionStrategy {
eachPlugin {
if (requested.id.id == 'com.example.my-plugin') {
useModule('com.example:my-plugin:1.0')
}
}
}
}

В памяти: pluginManagement загружает метаданные плагинов во время инициализации, добавляя минимальный overhead (10-30 МБ), но обеспечивая согласованность версий.



Нюансы и внутренние механизмы

Управление памятью:
Плагины загружаются как Java-классы в JVM, включая их зависимости. Крупные плагины (например, android) могут добавлять 500-1000 МБ overhead.
Скриптовые плагины парсятся как Groovy/Kotlin-скрипты, увеличивая потребление памяти из-за динамической компиляции.
Оптимизируйте с помощью pluginManagement для централизованного управления и минимизации дублирования.


Кэширование:
Плагины и их зависимости кэшируются в ~/.gradle/caches/modules-2, снижая сетевые запросы.
Очистка кэша:
rm -rf ~/.gradle/caches.


Производительность:
plugins {} быстрее, чем apply plugin:, за счет оптимизированного разрешения.
Параллельное выполнение задач (--parallel) ускоряет сборку, но увеличивает пиковое потребление памяти.
Используйте --configure-on-demand для сокращения времени конфигурации.


Отладка:
Используйте --info или --debug для анализа загрузки плагинов:
./gradlew build --debug


Проверьте список задач:
./gradlew tasks --all.


Build Scans (--scan) показывают влияние плагинов на сборку.

Совместимость:

Убедитесь, что плагины совместимы с версией Gradle (например, Android-плагины требуют Gradle 7.0+).
Используйте JAVA_HOME с JDK 8+ (рекомендуется 11+).


Безопасность:
Храните учетные данные для репозиториев в ~/.gradle/gradle.properties с ограниченными правами (chmod 600).
Проверяйте плагины из Gradle
Plugin Portal на наличие GPG-подписей.

#Java #middle #Gradle #Task #Plugin
👍2