5.03. Структуры проекта
Структуры проекта
★ Что такое пакет?
Пакетом (пространством имен) в Java называется структура вложенных по какому-то признаку папок с размещенными в них классами (интерфейсами, перечислениями, аннотациями), необходимыми проекту.
В Java используется пакетная структура – способ организации классов в папках, который помогает избежать конфликтов имён и группировать код логически. Это обязательная структура. Чтобы система понимала, что означает команда, указанная программистом в исходном коде в виде слова, нужно сообщить системе об использовании пакета, который содержит код-содержание этого слова:
«Дружище, налей мне молока!»
«А где мне взять молоко?».
Мы, люди, многие элементарные вещи уже изначально автоматизировали в себе и понимаем подсознательно. Мы прекрасно знаем, что молоко в холодильнике. Но программе нужно показать, что нам понадобится холодильник. Поэтому общение с программой будет как-то так:
«Дружище, запомни – вот холодильник. Там есть молоко».
«Дружище, налей мне молока!»
«Ок, вижу, молоко в холодильнике. Сейчас сделаю».
Вот поэтому код библиотеки или проекта формируется в составе пакета (package).
Пакеты в проекте хранятся в строгой структуре:
- com/mycompany/project/Main.java – физический путь;
- com.mycompany.project – путь в коде.
com – корень пакета. Только строчные буквы. Это префикс домена, обычно обратный интернет-домен компании или проекта. Нужен для уникальности пакетов в мире. Можно указывать своё, но рекомендуется использовать стандарт:
- com – для коммерческих проектов;
- org – для открытых проектов;
- net, io, ru – тоже допустимы.
mycompany – название компании или автора, допустим, имя (если проект личный). Желательно делать уникальным. Только строчные буквы, несмотря на то что это будет имя или название – допустим, не Timur, а timur.
project – название проекта или модуля, библиотеки, подсистемы. Допустим, calculator, utils или как-то так. Только строчные буквы, название может быть любым.
Современные Java-проекты используют системы сборки Maven и Gradle. Это инструменты, которые автоматизируют компиляцию кода, управление зависимостями (библиотеками), запуск тестов, создание готовых приложений и развёртывание (деплой).
★ Как работает Maven?
Конфигурация проекта хранится в файле pom.xml (Project Object Model), это «сердце» проекта.
pom.xml содержит:
- метаданные (название, версия, автор);
- зависимости (библиотеки);
- плагины (для сборки, тестирования);
- настройки профилей (dev, prod).
POM является базовым модулем Maven. Это специальный XML-файл, который всегда хранится в базовой директории проекта и называется pom.xml. Файл POM содержит информацию о проекте и различных деталях конфигурации, которые используются Maven для создания проекта.
Maven работает по жизненному циклу сборки проекта, который состоит из фаз. Каждая фаза представляет собой этап в процессе создания артефакта:
- validate - проверяет корректность проекта и наличия необходимых данных;
- compile - компилирует исходный код проекта;
- test – запускает юнит-тесты;
- package - упаковывает скомпилированный код в JAR/WAR/SO и т.д.;
- verify - выполняет проверки после упаковки перед установкой;
- install - устанавливает артефакт в локальное хранилище Maven;
- deploy - передаёт артефакт в удалённый репозиторий (например, Nexus, Artifactory).
Можно вызвать одну из этих фаз через команды, к примеру:
mvn compile # компиляция
mvn package # сборка артефакта
mvn install # установка в локальный репозиторий
Файлы проекта распределены по строгой стандартной структуре:
| Путь | Назначение |
|---|---|
/Проект | Общая папка проекта |
/Проект/pom.xml | Главный конфигурационный файл (Maven) |
/Проект/src | Директория, где хранится весь исходный код Java-проекта |
/Проект/src/main | Основной код проекта |
/Проект/src/main/java | Исходные файлы Java, организованные в пакетной структуре |
/Проект/src/main/java/com/mycompany/project | Пример пакета в проекте |
/Проект/src/main/resources | Ресурсы: конфигурационные файлы, локализация, изображения, CSS, JS и другие не-кодовые файлы |
/Проект/src/test | Тестовый код, не включаемый в финальную сборку |
/Проект/src/test/java | Тестовые классы (например, с использованием JUnit, TestNG) |
/Проект/src/test/resources | Конфигурация и ресурсы, используемые при тестировании |
/Проект/target | Каталог для автоматически генерируемых файлов (сборка, артефакты, временные файлы) |
★ Артефакт в Maven – это результат сборки проекта, например, JAR-файл, который содержит код, библиотеки, ресурсы и метаданные.
Каждый артефакт имеет уникальный идентификатор, состоящий из элементов:
- groupId – com.example – организация или домен;
- artifactId – my-app – имя проекта или библиотеки;
- version – 1.0.0., 2.1.3-SNAPSHOT – версия.
Пример:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.7.0</version>
</dependency>
Это будет ссылка на артефакт:
org.springframework.boot:spring-boot-starter-web:2.7.0
Артефакты бывают следующих видов:
- .jar – обычные Java-библиотеки;
- .war – веб-приложения;
- .pom – описание проекта;
- .aar – Android-библиотеки..
★ Репозиторий – это место, где хранятся артефакты. Они могут храниться локально (локальный репозиторий), в общедоступном репозитории Maven (центральный), и в удалённом (частном), для приватных артефактов.
При первом использовании зависимости Maven скачивает её из центрального репозитория, и сохраняет в локальный. При повторном использовании уже берёт из локального. То есть, добавляя зависимость в pom.xml, мы скачиваем и сохраняем локально в папку ~/.m2/repository.
★ Как работает Gradle?
Gradle – система автоматической сборки, построенная с учетом принципов Maven, но предоставляющая дополнительные возможности на языках Groovy и Kotlin вместо традиционной XML-образной формы представления конфигурации проекта.
Принцип разделения на src/main и src/test аналогичен Maven, но конфигурация хранится в build.gradle, а не в pom.xml. Отличие есть в папке для автоматически сгенерированных файлов – в Maven они хранятся по пути /target, а в Gradle - /build.
Краткое сравнение Maven и Gradle
| Критерий | Maven | Gradle |
|---|---|---|
| Тип конфигурации | XML | Groovy/Kotlin DSL |
| Файл конфигурации | pom.xml | build.gradle |
Команды в Maven и Gradle
| Критерий | Maven | Gradle |
|---|---|---|
| Компиляция | mvn compile | gradle compileJava |
| Запуск тестов | mvn test | gradle test |
| Сборка JAR/WAR | mvn package | gradle build |
| Установка в локальный кэш | mvn install | gradle publishToMavenLocal |
| Очистка кэша | mvn clean | gradle clean |
| Запуск приложения | mvn exec:java | gradle run |
| Пропустить тесты | mvn install -DskipTests | gradle build -x test |
| Обновить зависимости | mvn dependency:resolve | gradle dependencies |
| Создать проект | mvn archetype:generate | gradle init |
| Показать список задач | mvn help:describe | gradle tasks |
Аналогичные секции в pom.xml и build.gradle
| Maven | Gradle |
|---|---|
<groupId> | group |
<artifactId> | Имя проекта (из settings.gradle) |
<version> | version |
<properties> | Переменные в ext {} |
<dependencies> | dependencies {} |
maven-compiler-plugin | java.toolchain |