23. GRADLE. Сборщик проектов. (Java Enterprise - полный курс)

23. GRADLE. Сборщик проектов. (Java Enterprise - полный курс)

Что такое Gradle и зачем он нужен?

Введение в Gradle

  • Приветствие и цель урока: изучение Gradle как инструмента для автоматизации сборки проектов, аналогичного Maven.
  • Основные особенности работы Gradle: использование репозиториев Maven, наличие кэша для ускорения выполнения задач.

Структура и конфигурация

  • Жизненный цикл Gradle строится на тасках, что обеспечивает гибкость в конфигурации по сравнению с Maven.
  • Недостатки Maven: громоздкий XML-конфиг, сложная система плагинов и низкая гибкость в управлении зависимостями.

Преимущества Gradle

Гибкость и производительность

  • Возможность использования Kotlin для конфигурации проекта, что делает его более современным.
  • Установка проекта через интерфейс IDE: создание нового проекта с использованием Java 17.

Установка и настройка

  • Процесс установки Gradle через wrapper: указание пути к файлу gradle-wrapper.properties.
  • Преимущества использования wrapper: упрощение процесса настройки для других разработчиков.

Конфигурационные файлы Gradle

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

  • Файл gradle-wrapper.properties задает версию Gradle, которая будет скачиваться автоматически при необходимости.
  • Главный конфигурационный файл build.gradle аналогичен XML в Maven; используется для управления зависимостями и репозиториями.

Многомодульные проекты

  • Файл settings.gradle используется для многомодульных проектов; указывает другие модули проекта.

Основы работы с Gradle: Проект и задачи

Интерфейсы Project и Task

  • В Gradle существует интерфейс Project, который управляет настройками проекта, включая имя файла gradle.properties. Можно создавать файлы для различных билдов.
  • Интерфейс Task описывает конкретные задачи, которые необходимо выполнить в рамках проекта. Каждая задача состоит из экшенов, доступных через метод getActions().
  • Экшены представляют собой функциональные интерфейсы с одним методом execute(), что позволяет выполнять определенные действия в рамках задач.

Структура конфигурации Gradle

  • Объекты типа Script создаются для любого скрипта Gradle и делегируют создание конфигурации соответствующему типу скрипта. Project работает с объектами типа Script.
  • Инициализация начинается со считывания файлов build.gradle. Даже если кастомные файлы отсутствуют, создается основной объект Gradle.

Фаза конфигурации

  • После создания объекта Gradle добавляются все остальные конфигурации. Затем считывается файл с билдом, создается объект типа Script внутри объекта Settings.
  • В многомодульном приложении могут быть несколько объектов типа Project. Каждый проект вызывает getTasks() для построения графа задач.

Примеры использования Groovy в Gradle

  • В примере выводится строка на языке Groovy через команду println, демонстрируя работу с объектами Project и Root Project.
  • При выполнении скриптов можно увидеть совпадение хеш-кодов объектов Project и Root Project в случае простого приложения.

Создание и использование задач (Task)

  • Для создания своей задачи используется команда task Hello, которая может быть запущена без выполнения действий, просто выводя информацию на экран.
  • Задачи могут иметь описание и группы. Например, задав группу "javaguru", можно легко организовать задачи по категориям.

Работа с экшенами в задачах

  • Экшены можно добавлять к задачам через методы doLast или doFirst, что позволяет контролировать порядок их выполнения.
  • При добавлении нескольких экшенов важно учитывать порядок их вызова; сначала выполняются экшены из метода doFirst, затем из метода doLast.

Обзор методов управления задачами в Gradle

Принципы работы методов dulast и du-фиолст

  • Метод dulast добавляет задачи в конец очереди, что делает их выполнение последовательным. Например, дуласт 2 оказывается последним.
  • В отличие от этого, метод ду-фиолст добавляет задачи в начало очереди по принципу стека, что позволяет выполнять их в обратном порядке.

Управление зависимостями между задачами

  • Зависимости между задачами можно указать с помощью синтаксиса, например: Task 2 depends on Task 3. Это гарантирует выполнение третьей задачи перед второй.
  • При выполнении задач система учитывает зависимости: если задача зависит от другой, она будет выполнена только после завершения первой.

Построение графа задач

  • Граф задач строится на основе указанных зависимостей и определяет порядок выполнения всех действий при сборке проекта.
  • Для просмотра графа можно использовать команду gradle task/граф, которая показывает все задачи и их связи.

Конфигурация проекта через gradle.properties

  • Файл gradle.properties позволяет задавать глобальные параметры конфигурации проекта, такие как версия Java или другие переменные.
  • Важно не добавлять кастомные свойства для сторонних библиотек; они должны быть специфичны для конфигурации Gradle.

Оптимизация структуры скриптов Gradle

  • Если файл сборки становится слишком большим и сложным для восприятия, рекомендуется выделить части конфигурации в отдельные скрипты.

Как использовать плагины в Gradle?

Введение в плагины

  • Обсуждается необходимость применения плагина, который описан как класс. Упоминается использование команды apply plugin для активации кастомного плагина.

Работа с плагинами

  • Поясняется, что Java-плагин уже содержит множество готовых задач (тасков), которые используются по умолчанию для сборки приложения. Приводится пример создания собственного плагина для копирования ресурсов.

Жизненный цикл приложения

  • Рассматривается жизненный цикл приложения и его граф. Упоминается, что при вызове задачи build происходит последовательное выполнение всех связанных задач.

Компиляция и ресурсы

  • Описывается задача compile, которая обрабатывает Java-файлы и создает папку build с скомпилированными классами. Также упоминается создание тестового класса.

Обработка ресурсов

  • При выполнении задачи classes происходит компиляция Java и обработка ресурсов, создавая необходимые файлы .class. Задача processResources отвечает за обработку файлов из папки ресурсов.

Создание JAR файла

Архивация проекта

  • Объясняется задача jar, которая архивирует проект в JAR файл. Упоминается структура выходных данных и связь между задачами.

Тестирование кода

  • После выполнения основных задач выполняются аналогичные задачи для тестов, включая компиляцию тестовых классов. Однако сами тесты еще не запускаются на этом этапе.

Зависимости в Gradle

Подключение зависимостей

  • Обсуждается процесс подключения зависимостей в Gradle через блок репозиториев. Упоминается использование Maven Central как основного источника библиотек.

Репозитории компании

  • Описывается возможность использования корпоративного репозитория (например, Nexus), где хранятся кастомные библиотеки компании.

Пример подключения зависимости

Обзор зависимостей в Gradle

Поиск зависимостей и их хранение

  • Обновление проекта показывает, что все работает. Зависимости можно найти в блоке dependencies под классом, например, Spring Web версии 6.0.10.
  • Зависимости хранятся в локальном репозитории на компьютере пользователя, аналогично тому, как это было в файле settings.xml.
  • Путь к зависимостям: User/Андрей/.gradle/caches/modules-2/files-2.1/..., где находятся файлы JAR с исходным кодом и описанием модулей.

Структура кэширования и конфигурации

  • Структура кэширования сложнее из-за наличия дополнительной информации для ускорения работы Gradle.
  • В блоке dependencies используются различные команды: implementation, testImplementation, и runtimeOnly. Эти команды определяют необходимость зависимости на разных этапах компиляции.

Конфигурационные блоки зависимостей

  • Блок implementation указывает на зависимости, необходимые как для компиляции, так и для выполнения проекта.
  • Блоки compileOnly и annotationProcessor используются для указания зависимостей только во время компиляции (например, Lombok).

Разделение тестовых зависимостей

  • Зависимость runtimeOnly необходима только во время выполнения (например, JDBC драйвер), а не при компиляции.
  • Команды тестирования (testImplementation, testCompileClasspath) объединяют зависимости для тестов без лишних затрат ресурсов.

Транзитивные зависимости и их управление

  • Транзитивные зависимости могут конфликтовать между собой; необходимо разрешать эти конфликты при помощи директивы exclude.
  • При наличии нескольких версий одной библиотеки будет использоваться максимальная версия по умолчанию; важно управлять этими конфликтами правильно.

Исключение транзитивных зависимостей

Создание много модульного проекта с использованием Spring

Удаление зависимостей и создание модулей

  • Обсуждение удаления модуля Spring из транзитивной зависимости. При закомментировании он возвращается, что демонстрирует управление зависимостями.
  • Переход к созданию много модульного проекта с использованием Great Doll Starter. Проект будет включать модули: веб-сервис, базу данных и утилиты.
  • Создание нового проекта в IDE с несколькими модулями: Database, Service и Web. Важно отметить выбор галочки для веб-модуля для автоматической конфигурации.

Структура проекта и настройки

  • Завершение создания всех необходимых модулей: веб-сервис, база данных, общие утилиты и коры.
  • Просмотр файла настроек (settings), который показывает структуру проекта и его модули. Указание на то, какие модули не нужны.

Организация зависимостей между проектами

  • Обсуждение организации ссылок между проектами. Модуль Database зависит от утилитных классов для подключения к базе данных.
  • Подключение модуля Common utils в Database через указание Project common utill. Это позволяет использовать классы из утилитного модуля.

Транзитивные зависимости

  • Введение зависимости на проект Database в сервисах, чтобы они могли видеть классы из базы данных.
  • Для того чтобы утилиты были видны как транзитивная зависимость в сервисах, необходимо использовать плагин Java Library вместо обычного имплементации.

Заключительные мысли о Gradle

  • Обсуждение настройки build.gradle для обеспечения правильной работы транзитивных зависимостей между проектами.
Video description

Все как на работе: https://javaguru.by/bootcamp Микросервисы и kafka: https://javaguru.by/developer Трудоустройство: https://javaguru.by/job Kubernetes, метрики и логи: https://javaguru.by/kuber Углубленная kafka: https://javaguru.by/kafka Все мои курсы: https://javaguru.by Телеграм канал: https://t.me/javaguru_by Презентация: https://prezi.com/view/wd9PueWTCOIHqq04Isdz/ Разберем gradle в сравнении с maven. Настроим конфигурацию. Исследуем внутренности gradle. Научимся создавать свои таски, экшены и строить таск графы. Поймем как написать свой плагин. Освоим Gradle Task Graph, скоупы. Создадим многомодульный проект на gradle 00:00 Зачем нужен? Модель работы. Чем отличается от Maven? 02:18 Создаем gradle проект в idea 03:15 Wrapper. Конфигурация Gradle 06:55 Конфигурационные файлы 08:33 Как внутри устроен Gradle 12:47 Наглядная структура работы Gradle 14:50 Вызываем команды в build.gradle 16:30 Создаем свой Task 19:05 Создаем Action в Task 21:40 Строим свой Task Graph 27:00 Блок ext 28:00 gradle.properties 29:00 Делаем свой скрипт script.gradle 30:19 Делаем свой плагин 31:20 Плагин Java в gradle - все дефолтные таски 31:38 Зачем делать свои плагины? 32:23 Application Lifecycle - дефолтный Task Graph 38:55 Как подключаются зависимости и репозитории 43:09 Scope в gradle 48:00 Транзитивные зависимости 50:52 Многомодульный проект 58:09 Итог