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

Где указываются артефакты конечной сборки в 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:

  1. Тип<packaging> (jar, war, ear, zip)
  2. Директория<build><directory> (по умолчанию target/)
  3. Имя<build><finalName> (по умолчанию ${artifactId}-${version})
  4. Создание<build><plugins> (Maven плагины)
  5. Публикация<distributionManagement> (удалённый репозиторий)

После выполнения mvn package готовый артефакт находится в target/ директории и готов к развёртыванию.

Где указываются артефакты конечной сборки в Maven? | PrepBro