Что является результатом сборки проекта в Java?

Ответ

Результат сборки Java-проекта — это готовые к использованию артефакты, тип которых определяется конфигурацией проекта (обычное приложение, веб-приложение, библиотека).

Типичные результаты в зависимости от проекта:

Тип проекта Основной артефакт Расположение (Maven/Gradle)
Библиотека / Обычное приложение JAR-файл target/*.jar / build/libs/*.jar
Веб-приложение WAR-файл target/*.war / build/libs/*.war
Spring Boot приложение Исполняемый (fat) JAR target/*.jar / build/libs/*.jar
Модуль (без упаковки) Каталог с .class файлами target/classes / build/classes/java/main

Что включает в себя процесс сборки (build lifecycle):

  1. Компиляция исходного кода → .class файлы.
  2. Копирование ресурсов (конфиги, свойства).
  3. Выполнение тестов (опционально, но рекомендуется).
  4. Упаковка (packaging) → создание JAR/WAR архива.
  5. Для fat JAR: объединение всех зависимостей в один архив.

Пример конечной структуры для Maven-проекта Spring Boot:

target/
├── my-boot-app-0.0.1-SNAPSHOT.jar # Fat JAR (можно запустить java -jar)
├── classes/
│   └── ... # .class файлы
└── test-classes/
    └── ... # .class файлы тестов

Ответ 18+ 🔞

А, ну вот, смотри, объясняю как есть, без этих ваших заумных мануалов. Результат сборки — это, грубо говоря, то, что у тебя в итоге получается в руках, когда ты закончил этот цирк с конями под названием mvn clean install или gradle build.

Что там вылезает на свет божий, в зависимости от того, что ты строил:

Что ты делал Что получишь в итоге Где обычно валяется (Maven/Gradle)
Библиотека или просто приложение Обычный JAR-файл, который сам по себе нихуя не запустится target/*.jar / build/libs/*.jar
Веб-приложение (для какого-нибудь Tomcat'а) WAR-файл, этакий архив для сервлет-контейнера target/*.war / build/libs/*.war
Spring Boot приложение (модно, молодёжно) Толстый, жирный, исполняемый JAR (fat JAR). В нём всё, включая кухонную раковину. Запускается просто java -jar. target/*.jar / build/libs/*.jar
Просто модуль, который ты не упаковывал Папка с кучей скомпилированных .class файлов. Без архива, так, сырьё. target/classes / build/classes/java/main

А теперь, блядь, как это всё происходит, по шагам (build lifecycle, ёпта):

  1. Компиляция. Твой красивый исходник на Java превращается в эти самые .class файлы — байт-код, который понимает JVM.
  2. Копирование ресурсов. Все эти твои application.properties, XML'ки, картинки с котиками — переносятся куда надо.
  3. Запуск тестов. Вот тут-то часто и начинается пиздец. Если, конечно, ты их писал. А если нет — ну и хуй с ним, пропускаем.
  4. Упаковка (packaging). Всё это добро запихивается в архив — JAR или WAR.
  5. Для жирного Spring Boot JAR'а: происходит магия. Все зависимости, которые ты подключал, засасываются внутрь этого одного файла. Получается монструозная бандура, но зато самодостаточная.

Вот, смотри, как выглядит папка target у типичного Spring Boot проекта после сборки, чтобы ты представлял:

target/
├── my-boot-app-0.0.1-SNAPSHOT.jar # Вот он, красавец, fat JAR. Запускай и радуйся.
├── classes/                       # А это распакованное нутро — твои классы.
│   └── ... # куча .class файлов
└── test-classes/                  # Классы из тестов, если они были.
    └── ...

Вот и вся магия. Собрал, получил артефакт, запустил или задеплоил. Главное — чтобы на шаге с тестами всё не накрылось медным тазом.