Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Теги pom.xml в Maven
Maven использует pom.xml (Project Object Model) для управления проектом. Это конфигурационный файл в формате XML, который описывает структуру проекта, зависимости, плагины, сборку и прочее. Рассмотрю все важные теги, которые встречаются в production проектах.
Структура pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<!-- Основная информация о проекте -->
<groupId>com.example</groupId>
<artifactId>my-app</artifactId>
<version>1.0.0</version>
<packaging>jar</packaging> <!-- jar, war, ear, pom -->
<!-- Всё остальное -->
</project>
1. Идентификационные теги
<groupId>com.example</groupId>
<!-- Группа/организация. Обычно имя домена в обратном порядке -->
<!-- com.example, org.springframework, io.jsonwebtoken -->
<artifactId>my-app</artifactId>
<!-- Уникальное имя проекта внутри groupId -->
<!-- Может быть: user-service, payment-module, core-lib -->
<version>1.0.0</version>
<!-- Версия проекта. Обычно семверинг: major.minor.patch -->
<!-- 1.0.0-SNAPSHOT, 2.1.3, 3.0.0-RC1 -->
<packaging>jar</packaging>
<!-- Тип упаковки: jar, war, ear, pom -->
<!-- jar: обычное приложение/библиотека -->
<!-- war: веб-приложение (для Tomcat/Jetty) -->
<!-- ear: корпоративное приложение (для AS) -->
<!-- pom: родительский проект (без кода) -->
<name>My Application</name>
<!-- Человеческое название проекта -->
<description>This is a sample application</description>
<!-- Описание проекта -->
<url>https://github.com/example/my-app</url>
<!-- URL проекта -->
2. Информация о проекте
<inceptionYear>2020</inceptionYear>
<!-- Год создания проекта -->
<organization>
<name>My Company</name>
<url>https://example.com</url>
</organization>
<developers>
<developer>
<id>john</id>
<name>John Doe</name>
<email>john@example.com</email>
<roles>
<role>Lead Developer</role>
</roles>
</developer>
</developers>
<licenses>
<license>
<name>Apache License 2.0</name>
<url>https://www.apache.org/licenses/LICENSE-2.0</url>
</license>
</licenses>
<scm> <!-- Source Code Management -->
<url>https://github.com/example/my-app</url>
<connection>scm:git:https://github.com/example/my-app.git</connection>
<developerConnection>scm:git:ssh://git@github.com/example/my-app.git</developerConnection>
</scm>
3. Parent и Inheritance
<!-- Наследование от родительского pom -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.0.0</version>
<relativePath/> <!-- Путь к parent pom (если локально) -->
</parent>
<!-- Теперь наследуем версии, конфигурацию, плагины от parent -->
<!-- Очень удобно для многомодульных проектов -->
4. Properties (переменные)
<properties>
<!-- Версии -->
<java.version>17</java.version>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<!-- Версии библиотек -->
<spring-boot.version>3.0.0</spring-boot.version>
<junit.version>5.9.0</junit.version>
<lombok.version>1.18.24</lombok.version>
<!-- Пользовательские свойства -->
<app.name>${project.artifactId}</app.name>
<app.version>${project.version}</app.version>
</properties>
<!-- Использование в pom: ${java.version} -->
<!-- Использование в коде: mvn -Dspring-boot.version=3.1.0 -->
5. Dependencies (зависимости)
<dependencies>
<!-- Обычная зависимость -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>3.0.0</version>
<scope>compile</scope> <!-- compile, provided, runtime, test, system, import -->
</dependency>
<!-- Test зависимость (только в тестах) -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
<!-- Runtime зависимость (нужна только при запуске) -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.33</version>
<scope>runtime</scope>
</dependency>
<!-- Provided зависимость (предоставляется контейнером) -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope> <!-- Tomcat предоставляет -->
</dependency>
<!-- Optional зависимость (не обязательна) -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.24</version>
<optional>true</optional> <!-- Проекты-потребители не видят её -->
</dependency>
<!-- Исключение зависимостей (Exclusion) -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-jdk14</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
6. DependencyManagement (управление версиями)
<!-- Для многомодульных проектов -->
<!-- Определяются версии зависимостей один раз -->
<dependencyManagement>
<dependencies>
<!-- Spring BOM (Bill of Materials) -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>3.0.0</version>
<type>pom</type>
<scope>import</scope> <!-- Импортируем все версии -->
</dependency>
<!-- Наши версии -->
<dependency>
<groupId>com.example</groupId>
<artifactId>core-lib</artifactId>
<version>1.0.0</version>
</dependency>
</dependencies>
</dependencyManagement>
<!-- В модулях потом просто указываем без version: -->
<dependency>
<groupId>com.example</groupId>
<artifactId>core-lib</artifactId>
<!-- version НЕ указана, берётся из dependencyManagement -->
</dependency>
7. Repositories (репозитории артефактов)
<repositories>
<!-- Дополнительный репозиторий (помимо Maven Central) -->
<repository>
<id>jcenter</id>
<name>JCenter Repository</name>
<url>https://jcenter.bintray.com/</url>
<releases>
<enabled>true</enabled>
<updatePolicy>daily</updatePolicy>
</releases>
<snapshots>
<enabled>false</enabled> <!-- Снимки отключены -->
</snapshots>
</repository>
<!-- Приватный репозиторий компании -->
<repository>
<id>company-repo</id>
<name>Company Nexus Repository</name>
<url>https://nexus.company.com/repository/maven-releases/</url>
<authentication>
<username>${env.NEXUS_USERNAME}</username>
<password>${env.NEXUS_PASSWORD}</password>
</authentication>
</repository>
</repositories>
<!-- Репозиторий для плагинов -->
<pluginRepositories>
<pluginRepository>
<id>plugin-repo</id>
<url>https://repo.maven.apache.org/maven2</url>
</pluginRepository>
</pluginRepositories>
8. Build (конфигурация сборки)
<build>
<!-- Директории -->
<sourceDirectory>src/main/java</sourceDirectory>
<testSourceDirectory>src/test/java</testSourceDirectory>
<outputDirectory>target/classes</outputDirectory>
<testOutputDirectory>target/test-classes</testOutputDirectory>
<!-- Финальное имя артефакта -->
<finalName>my-app-${project.version}</finalName>
<!-- Ресурсы -->
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering> <!-- Подстановка переменных -->
<includes>
<include>**/*.properties</include>
<include>**/*.yml</include>
</includes>
</resource>
</resources>
<!-- Плагины сборки -->
<plugins>
<!-- Компилятор Java -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.10.1</version>
<configuration>
<source>17</source>
<target>17</target>
</configuration>
</plugin>
<!-- Упаковка JAR -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.2.0</version>
<configuration>
<archive>
<manifest>
<mainClass>com.example.Application</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
<!-- Сборка в Fat JAR (с зависимостями) -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>3.3.0</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<archive>
<manifest>
<mainClass>com.example.Application</mainClass>
</manifest>
</archive>
</configuration>
</execution>
</executions>
</plugin>
<!-- Тесты (Surefire) -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.2</version>
<configuration>
<includes>
<include>**/*Test.java</include>
<include>**/*Tests.java</include>
</includes>
</configuration>
</plugin>
<!-- Покрытие кода (JaCoCo) -->
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>0.8.8</version>
<executions>
<execution>
<goals>
<goal>prepare-agent</goal>
</goals>
</execution>
<execution>
<id>report</id>
<phase>test</phase>
<goals>
<goal>report</goal>
</goals>
</execution>
</executions>
</plugin>
<!-- Проверка стиля кода (Checkstyle) -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-checkstyle-plugin</artifactId>
<version>3.1.2</version>
<configuration>
<configLocation>google_checks.xml</configLocation>
</configuration>
</plugin>
</plugins>
</build>
9. Profiles (профили для разных окружений)
<profiles>
<!-- Профиль для разработки -->
<profile>
<id>dev</id>
<activation>
<activeByDefault>true</activeByDefault> <!-- Активен по умолчанию -->
</activation>
<properties>
<app.environment>development</app.environment>
<db.url>jdbc:mysql://localhost:3306/mydb</db.url>
</properties>
</profile>
<!-- Профиль для production -->
<profile>
<id>prod</id>
<properties>
<app.environment>production</app.environment>
<db.url>jdbc:mysql://prod-db:3306/mydb</db.url>
</properties>
<dependencies>
<!-- Production-only зависимости -->
</dependencies>
</profile>
<!-- Профиль для тестирования -->
<profile>
<id>test</id>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<excludedGroups>com.example.IntegrationTest</excludedGroups>
</configuration>
</plugin>
</plugins>
</build>
</profile>
</profiles>
<!-- Активация профилей: -->
<!-- mvn clean install -Pprod -->
<!-- mvn clean install -Pdev,test -->
10. Modules (многомодульный проект)
<!-- Parent pom.xml -->
<packaging>pom</packaging> <!-- Важно! -->
<modules>
<module>core</module>
<module>web</module>
<module>api</module>
</modules>
<!-- Структура: -->
<!-- parent-pom/ -->
<!-- ├── pom.xml -->
<!-- ├── core/ -->
<!-- │ └── pom.xml -->
<!-- ├── web/ -->
<!-- │ └── pom.xml -->
<!-- └── api/ -->
<!-- └── pom.xml -->
<!-- В child модулях: -->
<parent>
<groupId>com.example</groupId>
<artifactId>parent-pom</artifactId>
<version>1.0.0</version>
</parent>
11. Distribution (распределение артефактов)
<distributionManagement>
<!-- Где выкладывать готовые артефакты -->
<repository>
<id>releases</id>
<name>Releases Repository</name>
<url>https://nexus.company.com/repository/maven-releases/</url>
</repository>
<!-- Где выкладывать SNAPSHOT версии -->
<snapshotRepository>
<id>snapshots</id>
<name>Snapshots Repository</name>
<url>https://nexus.company.com/repository/maven-snapshots/</url>
</snapshotRepository>
<!-- Документация проекта -->
<site>
<id>project-site</id>
<url>https://example.com/my-app</url>
</site>
</distributionManagement>
12. Reporting (отчёты)
<reporting>
<plugins>
<!-- Отчёт о покрытии кода -->
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>0.8.8</version>
</plugin>
<!-- Javadoc -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-javadoc-plugin</artifactId>
<version>3.4.1</version>
</plugin>
<!-- Анализ кода (Spotbugs) -->
<plugin>
<groupId>com.github.spotbugs</groupId>
<artifactId>spotbugs-maven-plugin</artifactId>
<version>4.7.1.1</version>
</plugin>
</plugins>
</reporting>
Типичный production pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.0.0</version>
</parent>
<groupId>com.example</groupId>
<artifactId>user-service</artifactId>
<version>1.0.0</version>
<packaging>jar</packaging>
<name>User Service</name>
<description>User management microservice</description>
<properties>
<java.version>17</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
Команды Maven
# Установка зависимостей и компиляция
mvn clean install
# Запуск тестов
mvn test
# С профилем
mvn clean install -Pprod
# Сборка без тестов
mvn clean install -DskipTests
# Обновление зависимостей
mvn dependency:tree
mvn dependency:resolve
# Публикация в репозиторий
mvn deploy
В production я обычно использую parent POM от Spring Boot, DependencyManagement для версий, несколько профилей (dev/prod) и стандартные плагины для сборки, тестов и проверки качества кода.