Перейти к основному содержимому

Что такое артефакт Apache Maven?

· 6 мин. чтения

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