Что является результатом фазы сборки (build) в Java-проекте?

Ответ

Результатом фазы сборки (build) являются артефакты, готовые для развертывания и выполнения. Конкретный выход зависит от типа проекта и инструмента сборки (Maven, Gradle).

Основные артефакты:

  • Скомпилированные .class файлы (байт-код) — располагаются в директориях target/classes (Maven) или build/classes/java/main (Gradle).
  • Архивы для развертывания:
    • JAR (Java Archive) — для стандартных приложений и библиотек.
    • WAR (Web Application Archive) — для веб-приложений.
    • EAR (Enterprise Archive) — для корпоративных Java EE приложений.
  • Исполняемый (fat/uber) JAR — для Spring Boot и подобных приложений, содержит все зависимости и встроенный сервер.

Пример структуры после сборки Maven-проекта:

my-app/
└── target/
    ├── classes/                 # Скомпилированные .class файлы
    │   └── com/example/Main.class
    ├── my-app-1.0-SNAPSHOT.jar # Основной JAR-артефакт
    └── surefire-reports/       # Отчеты тестов (опционально)

В Gradle аналогичная структура создается в директории build/.

Ответ 18+ 🔞

А, слушай, ну это ж классика, блядь! Ты собрал проект, а на выходе — пиздец какой-то бардак, да? Нет, ну серьёзно, результат сборки — это как раз тот момент, когда твой код из кучи файлов превращается во что-то осязаемое, что можно, блядь, потрогать или, на худой конец, запустить и получить по ебалу ошибкой.

Вот смотри, что у тебя в сухом, прости господи, остатке после всей этой магии с Maven'ом или Gradle'ом:

Что вылезает наружу, типа артефакты:

  • Эти ваши .class файлы — скомпилированный байт-код, который уже не прочитать, как книжку. Лежат они, как правило, в папке target/classes (если ты мазохист и юзаешь Maven) или build/classes/java/main (если ты из секты Gradle). Без них — нихуя не запустится.
  • Архивы, готовые к бою:
    • JAR — обычная банка для библиотек или простых приложений. Классика жанра.
    • WAR — это уже для веб-приложений, чтобы засунуть в Tomcat или куда там ещё.
    • EAR — ну это для больших корпоративных монстров, там своя атмосфера, блядь.
  • Толстый (fat/uber) JAR — вот это, сука, моя любовь, особенно в Spring Boot. Всё, включая кухонную раковину, зависимости и встроенный сервер, запихано в одну банку. Красота, ёпта! Запустил — и попёрло.

Вот, наглядно, как это выглядит после сборки Maven'ом, чтобы не пиздеть:

my-app/
└── target/                     # Вот она, заветная папка, ради которой всё и затевалось
    ├── classes/                # Тут твои скомпилированные классы валяются
    │   └── com/example/Main.class # И вот он, красавец, готовый к работе
    ├── my-app-1.0-SNAPSHOT.jar # А это уже готовый артефакт, который можно тыкать пальцем
    └── surefire-reports/       # А тут отчёты, прошли ли твои тесты или всё пошло по пизде (опционально, но очень желательно)

У Gradle'я всё то же самое, только папка build вместо target. Суть-то одна, блядь: из кучи исходников получилось что-то, что можно использовать. Не жизнь, а сказка, прямо как с Герасимом и Муму, только без трагического финала, надеюсь.