Ручная компиляции кода довольно утомительный процесс даже во время обучения. В реальных приложениях такой подход просто не применим, слишком много действий придется делать руками. Для компиляции используются специальные системы сборки, такие как Maven или Gradle. Последний стал стандартом де-факто для новых приложений, поэтому рассмотрим работу именно с ним. Принцип у всех таких систем один и тот же, поэтому зная один, несложно разобраться и в других.
Gradle — это не просто автоматизатор компиляции. Это навороченная система сборки, где компиляция это всего лишь один из этапов. Сборка проекта – довольно широкое понятие. Она включает в себя компиляцию исходного кода, упаковку в jar, запуск тестов и другие шаги, необходимые для создания рабочего приложения. Ключевые возможности Gradle:
Полный список возможностей огромен. Большая часть из них работает автоматически, об этом не придется думать.
В повседневной работе Java-программист пользуется Gradle через редактор, но во время обучения нужно потратить немного времени на то, чтобы разобраться с тем как он работает. Иначе потом будет сложно, когда что-то пойдет не так и возникнет ошибка. Поэтому здесь мы проделаем все операции через консоль, а дальше подключим редактор.
Начнем с установки. Если Gradle у вас не установлен, то посмотрите инструкцию. Проверить установку можно так:
gradle -v
------------------------------------------------------------
Gradle 7.3.3
------------------------------------------------------------
Теперь инициализируем новый Gradle-проект:
# Создаем директорию для проекта
mkdir hexlet-gradle-project
cd hexlet-gradle-project
# Запускаем инициализацию
gradle init
Дальше Gradle задаст множество вопросов, на базе которых сформируется правильная структура. Gradle умеет работать далеко не только с Java, поэтому одним из вопросов будет то, какой язык использовать. Если во время создания вы ошиблись и выбрали не тот вариант, то ничего страшного. Просто дойдите до конца и пересоздайте директорию с проектом. Потом запустите все заново. Разбираем вопросы:
Select type of project to generate:
1: basic
2: application
3: library
4: Gradle plugin
Enter selection (default: basic) [1..4]
Мы хотим создать приложение. В отличие от библиотеки, приложение можно запускать, у него есть точка входа. Библиотека же предназначена для использования в другом коде, как например Apache Commons Lang.
Select implementation language:
1: C++
2: Groovy
3: Java
4: Kotlin
5: Scala
6: Swift
Здесь выбираем Java.
Split functionality across multiple subprojects?:
1: no - only one application project
2: yes - application and library projects
Gradle умеет работать с набором связанных проектов. Такое разбиение актуально, когда из проекта выделяются библиотеки или сам проект распадается на независимые проекты. Нам достаточно одного проекта.
Select build script DSL:
1: Groovy
2: Kotlin
Enter selection (default: Groovy) [1..2]
Сам Gradle написан на языке Groovy и для конфигурации тоже использует этот язык. Какое-то время назад появилась поддержка Kotlin. Пока выбираем Groovy в силу большей распространенности в статьях и документации.
Generate build using new APIs and behavior (some features may change in the next minor release)? (default: no) [yes, no]
Выбираем yes
Select test framework:
1: JUnit 4
2: TestNG
3: Spock
4: JUnit Jupiter
Enter selection (default: JUnit Jupiter) [1..4]
Gradle сразу предлагает установить фреймворк для тестирования. Пока выберем 4 пункт, а обучаться тестированию начнем в одном из следующих курсов.
Project name (default: hexlet-gradle-project):
Просто жмем Enter. Текущее имя директории и есть имя проекта.
Source package (default: hexlet.gradle.project):
Gradle предлагает выбрать пакет, внутри которого будет лежать наш проект. Тут стоит сказать, что один проект – один пакет. То же самое касается библиотек. Прямо сейчас имя не принципиально, мы не будем никуда публиковать наш код, поэтому просто соглашаемся и жмем Enter.
После этого появляется радостная надпись:
BUILD SUCCESSFUL in 8m 46s
Посмотрим на получившуюся структуру:
tree -a .
.
├── .gitattributes
├── .gitignore
├── app
│ ├── build.gradle
│ └── src
│ ├── main
│ │ ├── java
│ │ │ └── hexlet
│ │ │ └── gradle
│ │ │ └── project
│ │ │ └── App.java
│ │ └── resources
│ └── test
│ ├── java
│ │ └── hexlet
│ │ └── gradle
│ │ └── project
│ │ └── AppTest.java
│ └── resources
├── gradle
│ └── wrapper
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── gradlew
├── gradlew.bat
└── settings.gradle
16 directories, 10 files
Много всего, начнем по порядку.
Gradle сразу подготавливает проект к использованию через git добавив два файла .gitignore и .gitattributes. Игнорируются файлы сборки, которые попадут в директорию build и .gradle, это служебные файлы Gradle, которые он сам себе сгенерирует во время работы.
Файлы gradlew и gradlew.bat нужны для установки самого Gradle. Концепция здесь такая, Gradle во время создания проекта делает так, чтобы проект не использовал глобально установленный Gradle. Он скачивает сам себя в директорию gradle. Все команды будут запускаться через ./gradlew (в Windows ./gradlew.bat). Зачем так сделано? Так Gradle фиксирует версию. Если поменяется глобально установленная версия, то проект продолжит работать с той с которой он работал. Меньше шансов что-то сломать, но сложнее в обновлении.
Файл settings.gradle содержит различные настройки, например, там задается имя проекта. Остальное добавляется по мере развития и требований со стороны кода.
Самое интересное находится в директории app. Сначала мы видим файл build.gradle. Это основной файл Gradle, в котором на языке Groovy описано то, как будет работать система сборки:
plugins {
// Поддержка запуска из командной строки
id 'application'
}
repositories {
// Подключена автоматическая работа с Maven Central
mavenCentral()
}
dependencies {
// Библиотека Guava (аналог Apache Commons Lang) указана как зависимость
implementation 'com.google.guava:guava:30.1.1-jre'
}
testing {
suites {
// Конфигурация тестового окружения
test {
// Use JUnit Jupiter test framework
useJUnitJupiter('5.7.2')
}
}
}
application {
// Входная точка
mainClass = 'hexlet.gradle.project.App'
}
Именно с этим файлом придется работать больше всего, настраивая Gradle для подключения новых библиотек и их конфигурации.
Дальше, в этой же директории app находится src (source), место в котором лежит весь исходный код проекта. Структура здесь следующая. Директория main отвечает за код проекта и дополнительные ресурсы (директория src/main/resources), такие, как картинки, test – за тесты. Внутри каждой из них находится java, то есть тут лежит Java-код, но подразумевается, что бывает и по-другому. И вот только внутри java начинается структура соответствующая пакету проекта.
Попробуем запустить проект, а в следующем уроке поговорим о том, как конкретно работать с Gradle:
./gradlew run
> Task :app:run
Hello World! # Вот он вывод нашей программы
BUILD SUCCESSFUL in 2s
2 actionable tasks: 2 executed
Вам ответят команда поддержки Хекслета или другие студенты.
Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.
Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно
Наши выпускники работают в компаниях:
Зарегистрируйтесь или войдите в свой аккаунт