Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Теги Maven — полный справочник по конфигурации проекта
Maven использует файл pom.xml (Project Object Model) для определения структуры и зависимостей проекта. Понимание основных тегов критично для управления Java проектами. Рассмотрим наиболее важные и часто используемые теги.
Базовая структура POM файла
Корневые теги:
<?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>
<!-- Остальная конфигурация -->
</project>
Идентификация проекта (Project Identity)
groupId, artifactId, version — уникальный идентификатор:
<project>
<!-- Группа проекта (обычно обратное доменное имя) -->
<groupId>com.mycompany.app</groupId>
<!-- Имя артефакта (JAR, WAR, POM) -->
<artifactId>my-application</artifactId>
<!-- Версия проекта -->
<version>1.0.0-SNAPSHOT</version>
<!-- Тип упаковки (jar, war, ear, pom) -->
<packaging>jar</packaging>
<!-- Имя проекта -->
<name>My Application</name>
<!-- Описание проекта -->
<description>A sample Java application</description>
<!-- URL проекта -->
<url>https://github.com/example/my-app</url>
</project>
Информация о разработчиках
Теги для идентификации авторов:
<project>
<!-- Разработчик -->
<developers>
<developer>
<id>john</id>
<name>John Doe</name>
<email>john@example.com</email>
<url>https://github.com/john</url>
<organization>MyCompany</organization>
<roles>
<role>Java Developer</role>
<role>Tech Lead</role>
</roles>
<timezone>UTC+3</timezone>
</developer>
</developers>
<!-- Соучастник (contributor) -->
<contributors>
<contributor>
<name>Jane Smith</name>
<email>jane@example.com</email>
<roles>
<role>QA Engineer</role>
</roles>
</contributor>
</contributors>
<!-- Лицензия -->
<licenses>
<license>
<name>Apache License 2.0</name>
<url>https://www.apache.org/licenses/LICENSE-2.0</url>
<distribution>repo</distribution>
</license>
</licenses>
</project>
Зависимости (Dependencies)
Самая важная часть — управление библиотеками:
<project>
<dependencies>
<!-- Compile зависимость (по умолчанию) -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>3.0.0</version>
<!-- Scope: compile (по умолчанию) -->
<!-- Включается в final JAR -->
</dependency>
<!-- Test зависимость -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
<!-- Только для тестов, не входит в JAR -->
</dependency>
<!-- Runtime зависимость -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.30</version>
<scope>runtime</scope>
<!-- Нужна в runtime, но не в compile -->
</dependency>
<!-- Provided зависимость -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
<!-- Предоставляется контейнером (Tomcat) -->
</dependency>
<!-- Optional зависимость (не транзитивная) -->
<dependency>
<groupId>org.json</groupId>
<artifactId>json</artifactId>
<version>20230227</version>
<optional>true</optional>
</dependency>
<!-- Зависимость с исключением транзитивной подзависимости -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>6.0.0</version>
<exclusions>
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
</project>
Типы scope зависимостей:
- compile — в compile и runtime (по умолчанию)
- test — только для тестов
- runtime — в runtime, не в compile
- provided — предоставляется окружением
- system — из локальной системы
Управление версиями (Dependency Management)
Bill of Materials (BOM) для контроля версий:
<project>
<dependencyManagement>
<!-- Определение версий без явного указания в зависимостях -->
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>3.0.0</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<!-- Теперь версия берётся из dependencyManagement -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<!-- Версия не указана, будет взята из BOM -->
</dependency>
</dependencies>
</project>
Сборка (Build)
Конфигурация процесса сборки:
<project>
<build>
<!-- Исходные файлы -->
<sourceDirectory>src/main/java</sourceDirectory>
<testSourceDirectory>src/test/java</testSourceDirectory>
<!-- Ресурсы -->
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
<!-- Используется для замены переменных -->
</resource>
</resources>
<testResources>
<testResource>
<directory>src/test/resources</directory>
</testResource>
</testResources>
<!-- Плагины для сборки -->
<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.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>3.0.0</version>
</plugin>
<!-- JUnit тесты -->
<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>
<!-- Code coverage (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>
</plugins>
</build>
</project>
Профили (Profiles)
Различные конфигурации для разных окружений:
<project>
<profiles>
<!-- Development профиль -->
<profile>
<id>dev</id>
<properties>
<db.url>jdbc:mysql://localhost:3306/myapp_dev</db.url>
<db.username>dev_user</db.username>
</properties>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
</profile>
<!-- Production профиль -->
<profile>
<id>prod</id>
<properties>
<db.url>jdbc:mysql://prod-db:3306/myapp</db.url>
<db.username>prod_user</db.username>
</properties>
</profile>
<!-- Профиль для быстрой сборки без тестов -->
<profile>
<id>fast</id>
<properties>
<skipTests>true</skipTests>
</properties>
</profile>
</profiles>
</project>
Использование профилей:
mvn clean install -Pprod # Использовать prod профиль
mvn clean install -Pdev,fast # Несколько профилей
Свойства (Properties)
Определение переменных для переиспользования:
<project>
<properties>
<!-- Java версия -->
<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>
<lombok.version>1.18.26</lombok.version>
<!-- Пользовательские свойства -->
<app.name>My Application</app.name>
<app.version>1.0.0</app.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>${spring-boot.version}</version>
</dependency>
</dependencies>
</project>
Плагины (Plugins)
Расширение функциональности Maven:
<project>
<build>
<plugins>
<!-- Maven JAR плагин -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.2.2</version>
<configuration>
<archive>
<manifest>
<mainClass>com.example.App</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
<!-- Checkstyle для code style -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-checkstyle-plugin</artifactId>
<version>3.1.2</version>
</plugin>
<!-- SpotBugs для поиска ошибок -->
<plugin>
<groupId>com.github.spotbugs</groupId>
<artifactId>spotbugs-maven-plugin</artifactId>
<version>4.7.1.0</version>
</plugin>
</plugins>
</build>
</project>
Репозитории (Repositories)
Определение источников зависимостей:
<project>
<!-- Для скачивания зависимостей -->
<repositories>
<repository>
<id>central</id>
<url>https://repo.maven.apache.org/maven2</url>
</repository>
<repository>
<id>custom-repo</id>
<url>https://artifactory.example.com/artifactory/libs</url>
<authentication>
<username>${repo.username}</username>
<password>${repo.password}</password>
</authentication>
</repository>
</repositories>
<!-- Для публикации артефактов -->
<distributionManagement>
<repository>
<id>releases</id>
<url>https://artifactory.example.com/artifactory/releases</url>
</repository>
<snapshotRepository>
<id>snapshots</id>
<url>https://artifactory.example.com/artifactory/snapshots</url>
</snapshotRepository>
</distributionManagement>
</project>
Контроль исходников (SCM)
Информация о версионировании:
<project>
<scm>
<connection>scm:git:https://github.com/example/my-app.git</connection>
<developerConnection>scm:git:https://github.com/example/my-app.git</developerConnection>
<url>https://github.com/example/my-app</url>
<tag>v1.0.0</tag>
</scm>
</project>
Наследование и Modules
Parent POM для переиспользования конфигурации:
<!-- Parent pom.xml -->
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>parent-pom</artifactId>
<version>1.0.0</version>
<packaging>pom</packaging>
<properties>
<spring-boot.version>3.0.0</spring-boot.version>
</properties>
<dependencyManagement>
<dependencies>
<!-- Общие версии зависимостей -->
</dependencies>
</dependencyManagement>
</project>
<!-- Child pom.xml -->
<project>
<parent>
<groupId>com.example</groupId>
<artifactId>parent-pom</artifactId>
<version>1.0.0</version>
</parent>
<groupId>com.example</groupId>
<artifactId>my-app</artifactId>
<packaging>jar</packaging>
</project>
Multi-module проект:
<!-- Parent pom.xml -->
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>my-project</artifactId>
<packaging>pom</packaging>
<modules>
<module>core</module>
<module>api</module>
<module>web</module>
</modules>
</project>
Полезные команды Maven
# Просмотр эффективного POM
mvn help:effective-pom
# Просмотр дерева зависимостей
mvn dependency:tree
# Просмотр неиспользуемых зависимостей
mvn dependency:analyze
# Обновление версий плагинов
mvn versions:display-plugin-updates
# Проверка на уязвимости
mvn org.owasp:dependency-check-maven:check
Лучшие практики
- Используй parent POM для общей конфигурации
- Определяй версии в dependencyManagement перед использованием
- Используй properties для версий зависимостей
- Указывай scope явно для зависимостей
- Исключай конфликтующие зависимости через exclusions
- Используй профили для разных окружений
- Держи pom.xml в порядке — группируй похожие теги