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

Какая структура у pom-файла?

1.6 Junior🔥 271 комментариев
#Основы Java

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

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

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

Какая структура у pom-файла?

pom.xml (Project Object Model) — это основной конфигурационный файл в Maven проектах. Рассскажу о его структуре и назначении каждой части.

Базовая структура pom.xml

<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>
    <name>My Application</name>
    <description>Описание приложения</description>
    
    <!-- Зависимости -->
    <dependencies>...</dependencies>
    
    <!-- Настройки сборки -->
    <build>...</build>
    
</project>

1. Project Info (Информация о проекте)

<project>
    <!-- Версия формата POM (обычно 4.0.0) -->
    <modelVersion>4.0.0</modelVersion>
    
    <!-- Уникальный идентификатор организации -->
    <groupId>com.example.mycompany</groupId>
    
    <!-- Имя артифакта (джара, вара и т.д.) -->
    <artifactId>my-app</artifactId>
    
    <!-- Версия проекта -->
    <version>1.0.0</version>
    
    <!-- Тип упаковки: jar, war, pom, ear, etc -->
    <packaging>jar</packaging>
    
    <!-- Человекочитаемое имя -->
    <name>My Cool Application</name>
    
    <!-- Описание проекта -->
    <description>A cool application for doing cool things</description>
    
    <!-- URL проекта -->
    <url>https://example.com/my-app</url>
    
    <!-- Информация о лицензии -->
    <licenses>
        <license>
            <name>Apache License 2.0</name>
            <url>https://www.apache.org/licenses/LICENSE-2.0</url>
        </license>
    </licenses>
</project>

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

<dependencies>
    <!-- Spring Boot Starter -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
        <version>3.0.0</version>
        <!-- Scope определяет когда использовать зависимость -->
        <scope>compile</scope>  <!-- По умолчанию -->
    </dependency>
    
    <!-- PostgreSQL Driver -->
    <dependency>
        <groupId>org.postgresql</groupId>
        <artifactId>postgresql</artifactId>
        <version>42.5.0</version>
        <scope>runtime</scope>  <!-- Только при запуске -->
    </dependency>
    
    <!-- JUnit для тестирования -->
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.13.2</version>
        <scope>test</scope>  <!-- Только для тестов -->
    </dependency>
    
    <!-- Lombok -->
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.18.30</version>
        <scope>provided</scope>  <!-- Только при компиляции -->
    </dependency>
</dependencies>

<!-- Управление версиями зависимостей -->
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>2022.0.0</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

3. Build (Настройки сборки)

<build>
    <!-- Название скомпилированного артифакта -->
    <finalName>my-app</finalName>
    
    <!-- Plugins - расширяют функционал Maven -->
    <plugins>
        <!-- Spring Boot Maven Plugin -->
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <version>3.0.0</version>
            <executions>
                <execution>
                    <goals>
                        <goal>repackage</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
        
        <!-- Compiler Plugin -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.10.1</version>
            <configuration>
                <source>11</source>  <!-- Java версия для компиляции -->
                <target>11</target>
            </configuration>
        </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>
        
        <!-- JAR Plugin -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <version>3.2.2</version>
            <configuration>
                <archive>
                    <manifest>
                        <mainClass>com.example.Main</mainClass>
                    </manifest>
                </archive>
            </configuration>
        </plugin>
    </plugins>
    
    <!-- Source и test directories -->
    <sourceDirectory>src/main/java</sourceDirectory>
    <testSourceDirectory>src/test/java</testSourceDirectory>
    <resources>
        <resource>
            <directory>src/main/resources</directory>
        </resource>
    </resources>
</build>

4. Properties (Переменные)

<properties>
    <!-- Версии -->
    <java.version>11</java.version>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <spring.version>5.3.0</spring.version>
    <junit.version>4.13.2</junit.version>
    
    <!-- Используются в других местах -->
    <!-- <version>${spring.version}</version> -->
</properties>

5. Profiles (Профили)

<profiles>
    <!-- Production профиль -->
    <profile>
        <id>production</id>
        <properties>
            <db.url>jdbc:postgresql://prod-db:5432/myapp</db.url>
            <app.debug>false</app.debug>
        </properties>
    </profile>
    
    <!-- Development профиль -->
    <profile>
        <id>development</id>
        <properties>
            <db.url>jdbc:postgresql://localhost:5432/myapp_dev</db.url>
            <app.debug>true</app.debug>
        </properties>
        <activation>
            <activeByDefault>true</activeByDefault>
        </activation>
    </profile>
</profiles>

6. Scopes (Области видимости зависимостей)

ScopeОписаниеПримеры
compileВо всех сборкахSpring, Hibernate
providedКомпилируется, но не входит в JARServlet API
runtimeНужен только при запускеJDBC Driver
testТолько для тестовJUnit, Mockito
systemИз файловой системыРедко используется
importИмпорт BOMspring-cloud

Полный пример: Spring Boot приложение

<?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>
        <relativePath/>
    </parent>
    
    <groupId>com.example</groupId>
    <artifactId>spring-boot-app</artifactId>
    <version>1.0.0</version>
    <name>Spring Boot Application</name>
    
    <properties>
        <java.version>17</java.version>
    </properties>
    
    <dependencies>
        <!-- Web -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        
        <!-- Database -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>org.postgresql</groupId>
            <artifactId>postgresql</artifactId>
            <version>42.5.0</version>
            <scope>runtime</scope>
        </dependency>
        
        <!-- Util -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        
        <!-- Testing -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
    
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
        </plugins>
    </build>
    
</project>

Maven команды для сборки

mvn clean              # Удалить build директорию
mvn compile            # Скомпилировать проект
mvn test               # Запустить тесты
mvn package            # Создать JAR/WAR
mvn install            # Установить в локальный репозиторий
mvn deploy             # Задеплоить в удалённый репозиторий
mvn clean install      # Очистить и собрать
mvn -P production      # Использовать production профиль

Ключевые выводы

pom.xml содержит:

  1. ✓ Информацию о проекте (groupId, artifactId, version)
  2. ✓ Список зависимостей с версиями
  3. ✓ Настройки сборки (plugins, compiler settings)
  4. ✓ Переменные и профили
  5. ✓ Лицензионную информацию

Важные элементы:

  • groupId:artifactId:version — уникальный идентификатор
  • Scopes определяют когда использовать зависимость
  • Plugins расширяют возможности Maven
  • Properties используются для DRY принципа