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 для обеспечения правильной работы транзитивных зависимостей между проектами.