← Назад к вопросам

Что такое файл pom.xml в Maven?

1.6 Junior🔥 152 комментариев
#CI/CD и автоматизация

Комментарии (2)

🐱
deepseek-v3.2PrepBro AI5 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Что такое pom.xml в Apache Maven?

pom.xml (Project Object Model) — это фундаментальная единица конфигурации и управления в Apache Maven. Это XML-файл, который служит сердцем любого проекта, построенного с использованием Maven. По сути, это манифест или декларативное описание вашего проекта, содержащее всю необходимую метаинформацию, конфигурации сборки, зависимости и многое другое.

Роль и назначение POM

Основная роль pom.xml — предоставить Maven все необходимые данные для корректной сборки проекта (компиляции, тестирования, упаковки, развертывания). Он следует принципу "конфигурация над кодированием", что означает, что вы описываете что нужно сделать, а Maven определяет как это выполнить, используя плагины и жизненный цикл.

Ключевые разделы pom.xml

Рассмотрим основные элементы, которые почти всегда присутствуют в файле.

1. Базовые идентификаторы проекта (Maven Coordinates)

Это уникальный "адрес" вашего артефакта в репозитории.

<groupId>com.mycompany.app</groupId>
<artifactId>my-awesome-service</artifactId>
<version>1.0.0-SNAPSHOT</version>
<packaging>jar</packaging> <!-- или war, ear, pom и др. -->
  • groupId — идентификатор организации или проекта (например, доменное имя наоборот).
  • artifactId — имя самого проекта (jar/war-файла).
  • version — версия артефакта. Суффикс -SNAPSHOT указывает на развивающуюся, нерелизную версию.
  • packaging — тип упаковываемого артефакта.

2. Зависимости (Dependencies)

Пожалуй, самый важный раздел, где декларативно описываются все библиотеки, необходимые для сборки и работы проекта. Maven автоматически разрешает (скачивает) их из репозиториев.

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
        <version>2.7.5</version>
    </dependency>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.13.2</version>
        <scope>test</scope>
    </dependency>
</dependencies>

Ключевой атрибут здесь — <scope>, который определяет область видимости зависимости (например, compile — по умолчанию, test — только для тестов, provided — предоставляется средой выполнения).

3. Свойства (Properties)

Используются для централизации управления версиями и другими часто используемыми значениями, что упрощает их поддержку.

<properties>
    <java.version>11</java.version>
    <spring.version>5.3.23</spring.version>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>

Затем эти свойства можно использовать в других частях POM: ${java.version}.

4. Сборка (Build)

Раздел для настройки плагинов, которые выполняют реальную работу на разных фазах жизненного цикла (компиляция, тестирование, создание jar и т.д.).

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.10.1</version>
            <configuration>
                <source>${java.version}</source>
                <target>${java.version}</target>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

5. Родительский POM и управление наследованием

Maven поддерживает мощный механизм наследования. Проект может наследовать конфигурацию из родительского pom.xml. Это основа для создания многомодульных проектов и использования Maven BOM (Bill of Materials), как, например, spring-boot-starter-parent, который предоставляет готовые версии зависимостей и настройки плагинов.

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.7.5</version>
</parent>

POM в контексте DevOps

С точки зрения DevOps Engineer, pom.xml — это не просто файл сборки, а критически важный артефакт инфраструктуры как код (Infrastructure as Code, IaC) для области приложений. Он обеспечивает:

  • Воспроизводимость сборок: Любой разработчик или CI/CD-сервер (Jenkins, GitLab CI, GitHub Actions) может выполнить mvn clean install и получить абсолютно идентичный результат, благодаря зафиксированным версиям зависимостей.
  • Стандартизацию жизненного цикла: Единые команды (mvn test, mvn deploy) для всех проектов, независимо от их внутренней сложности.
  • Управление зависимостями и безопасность: Централизованное объявление библиотек позволяет автоматически сканировать уязвимости (с помощью инструментов вроде OWASP Dependency-Check, Sonatype Nexus IQ, Snyk) и управлять лицензиями.
  • Интеграцию в CI/CD пайплайн: POM явно определяет точки входа для компиляции, запуска тестов, статического анализа кода (через плагины like maven-checkstyle-plugin), создания Docker-образов (через jib-maven-plugin или dockerfile-maven-plugin) и публикации артефактов в репозиторий (Nexus, Artifactory).

Таким образом, pom.xml — это гораздо больше, чем скрипт сборки. Это декларативный контракт, который определяет структуру, зависимости и процесс жизненного цикла приложения, являясь ключевым элементом для автоматизации, предсказуемости и поддержания порядка в современных DevOps-практиках.