Maven POM
POM (Project Object Model) — основной конфигурационный файл Maven в формате XML, имя по умолчанию —pom.xml。
POM — базовая единица работы в проекте Maven. Это XML-файл, который содержит основную информацию о проекте, используется для описания того, как проект собирается, объявления зависимостей проекта и так далее.
При выполнении задачи или цели Maven ищет POM в текущем каталоге, получает необходимую информацию о конфигурации, а затем выполняет цель.
В POM можно указать следующие конфигурации:
- Зависимости проекта
- Плагины
- Цели выполнения
- Профили сборки проекта
- Версия проекта
- Список разработчиков проекта
- Информация о связанных списках рассылки
Перед созданием POM нам сначала нужно описать группу проекта (groupId), уникальный идентификатор проекта.
Все файлы POM требуют элемент project и три обязательных поля: groupId, artifactId и version.
| Узел | Описание |
|---|---|
| project | Корневой тег проекта. |
| modelVersion | Версию модели необходимо установить в 4.0. |
| groupId | Это идентификатор группы проектов. Обычно он уникален в пределах организации или проекта. Например, банковская организация com.companyname.project-group владеет всеми проектами, связанными с банковским делом. |
| artifactId | Это идентификатор проекта. Обычно это имя проекта. Например, Consumer Banking. groupId и artifactId вместе определяют расположение артефакта в репозитории. |
| version |
Это номер версии проекта. В репозитории артефактов он используется для различения разных версий. Например: com.company.bank:consumer-banking:1.0 com.company.bank:consumer-banking:1.1 |
Базовая структура POM-файла:
Пример
<!-- 1. Основная информация-->
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>my-app</artifactId>
<version>1.0.0</version>
<packaging>jar</packaging>
<!-- 2. Метаинформация-->
<name>Моё приложение</name>
<description>Демонстрационный проект</description>
<url>https://example.com</url>
<!-- 3. Управление зависимостями-->
<dependencies>...</dependencies>
<!-- 4. Конфигурация сборки-->
<build>...</build>
<!-- 5. Конфигурация окружения-->
<properties>...</properties>
<repositories>...</repositories>
</project>
Координаты проекта (обязательно):
| Элемент | Описание | Пример |
|---|---|---|
modelVersion | Версия модели POM (фиксированная4.0.0) | <modelVersion>4.0.0</modelVersion> |
groupId | Идентификатор организации/компании (обратное доменное имя) | <groupId>com.example</groupId> |
artifactId | Имя проекта | <artifactId>my-app</artifactId> |
version | Версия проекта | <version>1.0.0</version> |
packaging | Тип упаковки (jar/war/pom) | <packaging>jar</packaging> |
Метаинформация (необязательно):
| Элемент | Описание |
|---|---|
name | Название проекта (для отображения) |
description | Описание проекта |
url | Домашняя страница проекта |
licenses | Информация о лицензии |
organization | Информация об организации |
Пример
<description>Демонстрационный проект для изучения Maven</description>
<url>https://github.com/example/my-app</url>
Управление зависимостями
Зависимости проекта можно определить в POM-файле:
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>| Элемент | Описание |
|---|---|
groupId | Идентификатор организации зависимости |
artifactId | Название проекта зависимости |
version | Версия зависимости |
scope | Область действия зависимости (compile/test/provided/runtime) |
optional | Является ли зависимость необязательной (по умолчаниюfalse) |
Управление плагинами
Плагины, используемые в процессе сборки, также можно определить в файле POM:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>Часто используемые плагины:
maven-compiler-plugin: Указать версию Javamaven-surefire-plugin: Управлять выполнением тестовmaven-jar-plugin: Настроить JAR-пакет
Другие общие элементы
properties: Определить некоторые переменные свойств в проекте.
Используется для определения переменных и предотвращения дублирования:
<properties>
<java.version>11</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>Ссылка в зависимостях:
<version>${java.version}</version>
repositories: Конфигурация репозитория.
Указать удалённый репозиторий:
<repositories>
<repository>
<id>aliyun</id>
<url>https://maven.aliyun.com/repository/public</url>
</repository>
</repositories>
dependencyManagement: Используется для управления версиями зависимостей, особенно в многомодульных проектах.
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>5.3.9</version>
</dependency>
</dependencies>
</dependencyManagement>profiles: Используется для определения различных конфигураций сборки, позволяя выполнять сборки в соответствии с разными окружениями.
<profiles>
<profile>
<id>development</id>
<properties>
<environment>dev</environment>
</properties>
</profile>
<profile>
<id>production</id>
<properties>
<environment>prod</environment>
</properties>
</profile>
</profiles>
Наследование и агрегация
Наследование:Через элемент parent POM-файл может наследовать конфигурацию другого POM-файла:
<parent>
<groupId>com.example</groupId>
<artifactId>parent-project</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>Агрегация:Через элемент modules POM-файл может управлять несколькими подмодулями:
<modules>
<module>module1</module>
<module>module2</module>
</modules>Полный пример
Простой пример полного POM:
Пример
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>my-app</artifactId>
<version>1.0.0</version>
<packaging>jar</packaging>
<name>Моё приложение</name>
<description>Демонстрационный проект</description>
<properties>
<java.version>11</java.version>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
Родительский (супер) POM
Родительский (супер) POM — это POM по умолчанию в Maven. Все POM наследуются от родительского POM (независимо от того, явно ли определён этот родительский POM). Родительский POM содержит настройки по умолчанию, которые можно наследовать. Поэтому, когда Maven обнаруживает, что ему нужно загрузить зависимость, указанную в POM, он загружает её из репозитория по умолчанию http://repo1.maven.org/maven2, настроенного в супер-POM.
Maven использует эффективный POM (Super POM плюс собственную конфигурацию проекта) для выполнения связанных целей. Это помогает разработчикам делать как можно меньше конфигураций в pom.xml, но, конечно, эти конфигурации можно переопределить.
Используйте следующую команду для просмотра конфигурации Super POM по умолчанию:
mvn help:effective-pom
Затем мы создаём каталог MVN/project и создаём pom.xml в этом каталоге со следующим содержимым:
В командной консоли перейдите в каталог MVN/project и выполните следующую команду:
C:\MVN\project>mvn help:effective-pom
Maven начнёт обработку и отобразит effective-pom.
[INFO] Scanning for projects... Downloading: https://repo.maven.apache.org/maven2/org/apache/maven/plugins/maven-clean-plugin/2.5/maven-clean-plugin-2.5.pom ... [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 01:36 min [INFO] Finished at: 2018-09-05T11:31:28+08:00 [INFO] Final Memory: 15M/149M [INFO] ------------------------------------------------------------------------
Полученный Effective POM отображается в консоли; после наследования и интерполяции конфигурация вступает в силу.
В приведённом выше pom.xml вы можете увидеть структуру каталогов исходного кода проекта по умолчанию, выходной каталог, необходимые плагины, репозитории и каталоги отчётов, которые нужны Maven при выполнении целей.
Файл pom.xml Maven не нужно писать вручную.
Maven предоставляет большое количество плагинов архетипов для создания проектов, включая структуру проекта и pom.xml.
Подробное объяснение тегов POM
Ниже приведено объяснение по категориям всех важных тегов в pom.xml, охватывающее основное содержимое, такое как информация о проекте, управление зависимостями, конфигурация сборки и настройки окружения.
Теги, которые должны содержать все POM-файлы:modelVersion, groupId, artifactId и version。
| Тег | Категория | Описание | Пример/Необязательные значения | Обязательно ли |
|---|---|---|---|---|
| Основная информация | ||||
<modelVersion> |
Структура проекта | Версия модели POM | 4.0.0 |
Да |
<groupId> |
Координаты | Идентификатор организации (обратное доменное имя) | com.example |
Да |
<artifactId> |
Координаты | Имя проекта | my-project |
Да |
<version> |
Координаты | Версия проекта | 1.0.0-SNAPSHOT |
Да |
<packaging> |
Тип проекта | Формат упаковки | jar/war/pom |
Нет (по умолчанию jar) |
<name> |
Метаинформация | Отображаемое имя проекта | My Application |
нет |
<description> |
Метаинформация | Описание проекта | A demo project |
нет |
<url> |
Метаинформация | URL домашней страницы проекта | https://example.com |
нет |
| Управление зависимостями | ||||
<dependencies> |
Зависимость | Контейнер списка зависимостей | Содержит несколько<dependency> |
нет |
<dependency> |
Зависимость | Определение одной зависимости | СодержитgroupIdи другие подтеги |
Optional |
<scope> |
Зависимость | Область действия зависимости | compile/test/provided/runtime |
Нет (по умолчанию compile) |
<optional> |
Зависимость | Является ли зависимость опциональной | true/false |
Нет (по умолчанию false) |
<exclusions> |
Зависимость | Исключить транзитивные зависимости | Содержит<exclusion>Список |
нет |
| Конфигурация сборки | ||||
<build> |
Сборка | Контейнер конфигурации сборки | Содержит конфигурации плагинов/ресурсов и т. д. | нет |
<plugins> |
Сборка | Контейнер списка плагинов | Содержит несколько<plugin> |
нет |
<plugin> |
Сборка | Определение одного плагина | Необходимо указатьgroupIdиartifactId |
Optional |
<resources> |
Сборка | Конфигурация файла ресурсов | Определение<resource>Путь |
нет |
<testResources> |
Сборка | Конфигурация файла тестовых ресурсов | Аналогично<resources> |
нет |
<finalName> |
Сборка | Имя итогового файла пакета | my-app |
нет |
| Конфигурация окружения | ||||
<properties> |
Конфигурация | Контейнер пользовательских переменных | Определяет пары ключ-значение | нет |
<java.version> |
Свойства | Переменная версии Java | 11/17ожидание |
нет |
<repositories> |
Репозитории | Пользовательский список удалённых репозиториев | Содержит<repository> |
нет |
<pluginRepositories> |
Репозиторий | Пользовательский репозиторий плагинов | Аналогично<repositories> |
нет |
| Многомодульное управление | ||||
<modules> |
Модули | Список подмодулей | Содержит несколько<module> |
Требуется для агрегаторных проектов |
<parent> |
Наследовать | Ссылка на родительский POM | Необходимо указать координаты родительского проекта | Требуется для наследуемых проектов |
<dependencyManagement> |
Зависимости | Централизованное управление версиями зависимостей | Определяет версии, но не вводит | нет |
<profiles> |
Конфигурация | Контейнер профиля окружения | Определяет различные конфигурации окружения | нет |
| Другая информация | ||||
<licenses> |
Юридическая информация | Информация о лицензии | Содержит<license> |
нет |
<developers> |
Люди | Список разработчиков | Содержит<developer> |
нет |
<contributors> |
Люди | Список участников | Аналогично<developers> |
нет |
<issueManagement> |
Управление | Система отслеживания ошибок | Определяет URL системы отслеживания ошибок | нет |