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

Какие знаешь теги pom.xml?

1.3 Junior🔥 191 комментариев
#Другое#Основы Java

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