1. Обзор
Создание сложного проекта вручную довольно обременительно. Есть гораздо более простые способы сделать это с помощью инструментов сборки. Как известно, одним из основных инструментов сборки Java-проектов является Maven . Maven помогает стандартизировать сборку и развертывание приложений.
В этом уроке мы обсудим, что такое артефакт Maven и каковы его ключевые элементы. Мы также рассмотрим координаты Maven, управление зависимостями и, наконец, репозитории Maven.
2. Что такое Мавен?
Мы можем использовать Maven для создания и управления любым проектом на основе Java . Он предоставляет множество функций, таких как:
- построение и компиляция
- документация и отчет
- управление зависимостями
- управление источниками
- обновление проекта
- развертывание
Каждый проект Maven имеет свой собственный файл POM . Мы можем настроить Maven для создания одного или нескольких проектов.
Мультипроект обычно определяет файл POM в корневом каталоге и перечисляет отдельные проекты в разделе модулей .
Короче говоря, сборка Maven создает один или несколько артефактов .
3. Что такое артефакт Maven?
Артефакт — это элемент, который проект может либо использовать, либо производить. В терминологии Maven артефакт — это результат, созданный после сборки проекта Maven. Это может быть, например, jar
, war
или любой другой исполняемый файл.
Кроме того, артефакты Maven включают в себя пять ключевых элементов: groupId
, ArtiftId
, version
, package
и classifier
. Это элементы, которые мы используем для идентификации артефакта, и они известны как координаты Maven.
4. Координаты Мавена
Координата Maven — это комбинация значений groupId
, ArtiftId
и версии
для данного артефакта. Более того, Maven использует координаты для поиска любого компонента, соответствующего значениям groupId, ArtiftId
и version
.
Среди элементов координат мы должны определить groupId
, ArtifactId
и version
.
Элемент упаковки
является необязательным, и мы не можем напрямую определить классификатор
.
Например, в файле конфигурации pom.xml
ниже показан пример координат Maven:
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>org.foreach</groupId>
<artifactId>org.foreach.java</artifactId>
<packaging>jar</packaging>
<version>1.0.0-SNAPSHOT</version>
<name>org.foreach.java</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.1.2</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
Давайте подробно рассмотрим каждую из координат Maven.
4.1. Элемент groupId
_
Элемент groupId
— это идентификатор группы в начале проекта . Этот ключ упрощает и ускоряет организацию и поиск проекта.
Кроме того, groupId
следует тем же правилам именования, что и пакеты Java, и мы обычно выбираем в качестве groupId
имя верхнего пакета проекта.
Например, groupId
org.apache.commons
соответствует $ {repository_home}/org/apache/commons.
4.2. Элемент ArtiftId
_
Элемент ArtiftId
— это идентификатор проекта внутри группы. Он используется по умолчанию для создания окончательного имени артефакта. Поэтому это имя имеет некоторые особенности, поскольку в идеале оно должно быть небольшим по длине. Лучшей практикой для именования артефакта
является использование фактического имени проекта в качестве префикса. Преимущество этого в том, что он упрощает поиск артефактов.
Подобно groupId
, ArtifactId
проявляется как подкаталог в дереве каталогов, которое представляет groupId
.
Например, ArtifactId commons-lang3 под groupId
org.apache.commons будет
определять , что
артефакт находится в: $
{repository_home}/org/apache/commons/commons-lang3/
.
4.3. Элемент версии
_
Версия используется как часть идентификатора артефакта .
Он определяет текущую версию проекта Maven . Следует отметить, что Maven определяет набор спецификаций версий, а также концепцию релизов и моментальных снимков, которые мы рассмотрим позже.
Версия представлена в виде подкаталога в дереве каталогов, которое формируется из идентификатора
группы
и идентификатора артефакта
.
Например, версия 3.1.1
для артефакта с идентификатором commons-lang3
под идентификатором
группы org.apache.commons будет
определять, что артефакт находится в папке: ${repository_home}/org/apache/commons/commons-lang3/3.1. 1/.
4.4. Элемент упаковки
_
Этот элемент используется для указания типа артефакта, созданного проектом. Упаковкой может
быть все, что описывает любой формат двоичного программного обеспечения , включая ZIP, EAR, WAR, SWC, NAR, SWF, SAR.
Кроме того, упаковка
определяет различные цели, которые необходимо выполнить в течение жизненного цикла проекта по умолчанию. Например, на этапе пакета выполняется цель jar:jar
для артефакта типа jar и цель war:war
для артефакта типа war.
4.5. Элемент классификатора
_
Обычно мы используем классификатор
по техническим причинам при доставке одного и того же кода, но в виде нескольких отдельных артефактов .
Например, если мы хотим создать два артефакта JAR
с помощью разных компиляторов Java, мы можем легко сделать это с помощью классификатора
, поскольку он позволяет создавать два разных артефакта с одной и той же комбинацией для groupId:artifactId:version
.
Кроме того, мы можем использовать классификаторы
при упаковке исходного кода, JavaDoc артефакта или сборке двоичных файлов.
Для приведенного выше примера commons-lang3
артефакт, который нужно искать, это: commons-lang3-3.10-javadoc.jar
или commons-lang3-3.10-sources.jar
в ${repository_home}/org/apache/commons/commons- язык 3/3.1.0/.
5. Артефакты релиза и моментального снимка
Теперь давайте посмотрим на различия между артефактом моментального снимка и артефактом выпуска .
5.1. Выпуск артефактов
Артефакт
выпуска указывает, что версия стабильна и может использоваться вне процессов разработки, таких как интеграционные тесты, квалификация клиентов, подготовка к производству и т. д.
Кроме того, артефакт выпуска уникален. Запуск команды mvn
deploy
развернет наш проект в репозиторий. Но последующее выполнение той же команды в том же проекте с той же версией приведет к сбою.
5.2. Артефакты снимков
Артефакт моментального снимка указывает на то, что проект находится в стадии разработки . Когда мы устанавливаем или публикуем компонент, Maven проверяет атрибут версии .
Если он содержит строку «SNAPSHOT», Maven преобразует этот ключ в значение даты и времени в формате UTC (Всемирное координированное время).
Например, если наш проект находится в версии 1.0-SNAPSHOT, и мы развертываем его артефакты в репозитории Maven, Maven преобразует эту версию в «1.0-202202019-230800», предполагая, что мы развертываем 19 февраля 2022 г. в 23:08 UTC.
Другими словами, когда мы развертываем моментальный снимок, мы не предоставляем программный компонент, а только его моментальный снимок.
6. Управление зависимостями
Управление зависимостями имеет важное значение в мире Maven. Например, когда проект зависит от других классов в своем рабочем процессе (компиляция, выполнение), возникает необходимость идентифицировать и импортировать эти зависимости из удаленных репозиториев в локальный репозиторий. Следовательно, проект будет иметь зависимости от этих библиотек, которые в конечном итоге будут добавлены в путь к классам проекта.
Кроме того, управление зависимостями Maven основано на нескольких концепциях:
- репозитории: необходимы для хранения артефактов
- область: позволяет нам указать, в каком контексте мы используем зависимость
- транзитивность: позволяет нам управлять зависимостями зависимостей
- наследование: POM, наследующие от родителя, могут установить свою зависимость, предоставив только
идентификатор группы
иартефакта
зависимости без атрибутаверсии .
Maven получает соответствующую версию из родительского файла POM.
В Maven управление зависимостями осуществляется через pom.xml
. Например, объявление зависимости в проектах Maven выглядит так:
<dependencies>
<dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-plugin-api</artifactId>
<version>3.8.4</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>5.3.15</version>
</dependency>
</dependencies>
7. Репозиторий Maven
Maven использует репозиторий для хранения таких элементов, как зависимости и плагины, необходимые для создания проектов . Это позволяет централизовать эти элементы, которые обычно используются в нескольких проектах.
Как мы упоминали ранее, репозитории хранят артефакты, используя набор координат: groupId
, ArtiftId
, версия
и упаковка
. Кроме того, Maven использует определенную структуру каталогов для организации содержимого репозитория и позволяет ему находить необходимые элементы: ${repository_home}/groupId/artifactId/version
.
Например, давайте рассмотрим эту конфигурацию POM.
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.foreach</groupId>
<artifactId>myApp</artifactId>
<version>1.0.0</version>
</project>
С приведенной выше конфигурацией наш проект будет храниться в репозитории по пути ${repository_home}/com/foreach/myApp/1.0.0/
.
8. Заключение
В этой статье мы обсудили концепцию артефактов Maven и их системы координат. Кроме того, мы изучили связанные понятия, такие как зависимости и репозитории.