← Назад к вопросам
Где указываются артефакты конечной сборки в Maven?
1.2 Junior🔥 101 комментариев
#Другое
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Артефакты конечной сборки в Maven
Этот вопрос касается конфигурации Maven и того, где указываются выходные артефакты (готовый код) после сборки проекта.
Основная концепция
Мaven — это инструмент управления зависимостями и сборкой Java проектов. Артефакт (artifact) — это конечный продукт сборки, обычно JAR, WAR, EAR или другой архив.
Основной файл конфигурации: pom.xml
Все параметры сборки указываются в файле pom.xml (Project Object Model) в корне проекта.
<?xml version="1.0" encoding="UTF-8"?>
<project>
<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>Example Maven project</description>
<!-- Конфигурация сборки -->
<build>
<!-- ← Здесь указываются артефакты и плагины -->
</build>
</project>
1. Элемент <packaging> — Тип артефакта
<!-- JAR архив (по умолчанию) -->
<packaging>jar</packaging>
<!-- Результат: target/my-app-1.0.0.jar -->
<!-- WAR архив для web приложений -->
<packaging>war</packaging>
<!-- Результат: target/my-app-1.0.0.war -->
<!-- EAR архив для enterprise -->
<packaging>ear</packaging>
<!-- Результат: target/my-app-1.0.0.ear -->
<!-- POM - для parent проектов -->
<packaging>pom</packaging>
<!-- ZIP архив -->
<packaging>zip</packaging>
2. Директория target/ — Выходная директория
По умолчанию Maven создаёт артефакты в директории target/:
my-project/
├── src/
│ ├── main/
│ │ ├── java/
│ │ ├── resources/
│ │ └── webapp/
│ └── test/
├── target/ ← ВЫХОДНАЯ ДИРЕКТОРИЯ
│ ├── classes/ ← скомпилированные .class файлы
│ ├── test-classes/ ← скомпилированные тесты
│ ├── my-app-1.0.0.jar ← ← ← ГОТОВЫЙ АРТЕФАКТ
│ ├── my-app-1.0.0-sources.jar ← исходники
│ └── generated-sources/
├── pom.xml
└── README.md
3. Элемент <build> — Конфигурация сборки
<build>
<!-- Директория выходных артефактов -->
<directory>target</directory>
<!-- Имя финального артефакта -->
<finalName>my-app-${project.version}</finalName>
<!-- Директория скомпилированных классов -->
<outputDirectory>target/classes</outputDirectory>
<!-- Директория скомпилированных тестов -->
<testOutputDirectory>target/test-classes</testOutputDirectory>
<!-- Плагины сборки -->
<plugins>
<!-- Maven Compiler Plugin -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>11</source>
<target>11</target>
</configuration>
</plugin>
<!-- Maven Shade Plugin (создание fat JAR) -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.2.4</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<finalName>app-with-dependencies</finalName>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>com.example.Main</mainClass>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
<!-- Maven Assembly Plugin -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>3.3.0</version>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<archive>
<manifest>
<mainClass>com.example.Main</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
</plugins>
</build>
4. Элемент <finalName> — Имя артефакта
<build>
<!-- По умолчанию -->
<finalName>${project.artifactId}-${project.version}</finalName>
<!-- Результат: my-app-1.0.0.jar -->
</build>
<!-- Можно переопределить -->
<build>
<finalName>application</finalName>
<!-- Результат: application.jar -->
</build>
5. Профили сборки — Разные артефакты для разных окружений
<profiles>
<!-- Профиль для разработки -->
<profile>
<id>dev</id>
<build>
<finalName>app-dev</finalName>
</build>
</profile>
<!-- Профиль для production -->
<profile>
<id>prod</id>
<build>
<finalName>app-prod</finalName>
<plugins>
<!-- Минификация, оптимизация для prod -->
</plugins>
</build>
</profile>
</profiles>
<!-- Использование: mvn clean package -P prod -->
6. Публикация артефактов — Репозиторий
<distributionManagement>
<!-- Куда выкладываются RELEASE артефакты -->
<repository>
<id>central</id>
<url>https://repo.maven.apache.org/maven2</url>
</repository>
<!-- Куда выкладываются SNAPSHOT артефакты -->
<snapshotRepository>
<id>central-snapshots</id>
<url>https://oss.sonatype.org/content/repositories/snapshots</url>
</snapshotRepository>
</distributionManagement>
Практический пример: Spring Boot приложение
<?xml version="1.0" encoding="UTF-8"?>
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>spring-boot-app</artifactId>
<version>2.0.0</version>
<packaging>jar</packaging>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.0</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
<build>
<finalName>app</finalName>
<plugins>
<!-- Spring Boot Maven Plugin создаёт executable JAR -->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<mainClass>com.example.Application</mainClass>
</configuration>
</plugin>
</plugins>
</build>
</project>
<!-- После mvn clean package получается: -->
<!-- target/app.jar - готовое приложение для запуска -->
<!-- java -jar target/app.jar -->
Команды Maven для сборки
# Скомпилировать код
mvn compile
# Запустить тесты
mvn test
# Собрать артефакт (JAR/WAR)
mvn package
# Собрать и установить в локальный репозиторий
mvn install
# Собрать и выложить в удалённый репозиторий
mvn deploy
# Очистить директорию target
mvn clean
# Полная сборка с тестами
mvn clean test package
# Сборка с определённым профилем
mvn clean package -P prod
Структура артефакта JAR
my-app-1.0.0.jar
├── com/
│ └── example/
│ ├── Main.class
│ ├── UserService.class
│ └── ...
├── config/
│ └── application.properties
├── META-INF/
│ ├── MANIFEST.MF ← метаинформация
│ ├── maven/
│ │ └── com.example/my-app/
│ │ ├── pom.xml
│ │ └── pom.properties
│ └── services/
│ └── java.io.Reader ← SPI (Service Provider Interface)
└── lib/ ← зависимости (если fat JAR)
├── spring-core.jar
├── log4j.jar
└── ...
MANIFEST.MF — Метаинформация артефакта
Manifest-Version: 1.0
Created-By: Maven Jar Plugin 3.2.0
Main-Class: com.example.Application
Class-Path: lib/spring-core.jar lib/commons-logging.jar
Bundle-Name: My Application
Bundle-Version: 1.0.0
Возможные места указания артефактов
| Место | Описание |
|---|---|
<packaging> | Тип артефакта (jar, war, ear) |
<build><directory> | Директория выходных артефактов |
<build><finalName> | Имя финального артефакта |
<build><plugins> | Плагины, которые создают артефакты |
<profiles> | Разные конфигурации для разных окружений |
<distributionManagement> | Куда выкладывать готовые артефакты |
Итоговая иерархия pom.xml
pom.xml
├── <modelVersion>
├── <groupId>, <artifactId>, <version>
├── <packaging> ← ТИП АРТЕФАКТА
├── <build>
│ ├── <directory> ← ДИРЕКТОРИЯ ВЫХОДНЫХ АРТЕФАКТОВ
│ ├── <finalName> ← ИМЯ АРТЕФАКТА
│ ├── <plugins> ← ПЛАГИНЫ, СОЗДАЮЩИЕ АРТЕФАКТЫ
│ └── <resources>
├── <profiles>
└── <distributionManagement> ← РЕПОЗИТОРИЙ ДЛЯ ПУБЛИКАЦИИ
Заключение
Артефакты конечной сборки в Maven указываются в файле pom.xml:
- Тип —
<packaging>(jar, war, ear, zip) - Директория —
<build><directory>(по умолчаниюtarget/) - Имя —
<build><finalName>(по умолчанию${artifactId}-${version}) - Создание —
<build><plugins>(Maven плагины) - Публикация —
<distributionManagement>(удалённый репозиторий)
После выполнения mvn package готовый артефакт находится в target/ директории и готов к развёртыванию.