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

Ответ

Результатом сборки Java-приложения является переносимый байт-код и, как правило, упакованный артефакт для запуска.

Основные результаты:

  1. *Байт-код (`.classфайлы)** — результат компиляции исходного кода (*.java`). Этот байт-код выполняется JVM.
  2. Архив приложения (чаще всего JAR-файл) — упакованная коллекция .class файлов, ресурсов и метаинформации (MANIFEST.MF).

Ключевые особенности итогового артефакта:

  • Портативность: JAR-файл может быть запущен на любой платформе с установленной подходящей JVM.
  • Манифест: Файл META-INF/MANIFEST.MF внутри JAR может указывать главный класс для запуска (Main-Class).
  • Зависимости: В случае обычного JAR-файла зависимости (другие библиотеки) должны быть предоставлены отдельно в classpath. В исполняемом (fat) JAR (например, Spring Boot) все зависимости встроены внутрь.

Пример команды запуска:

# Запуск из class файлов
java -cp "target/classes" com.example.Main

# Запуск из JAR-файла
java -jar target/my-application.jar

Ответ 18+ 🔞

А, ну вот, смотри, классика жанра! Собрал ты своё Java-приложение, накодил, настрадался, и что в сухом остатке, спрашивается? А остаётся, блядь, магия переносимости, вот что!

Что у тебя в коробке после всей этой движухи:

  1. *Байт-код, эти самые `.classфайлы.** Это как если бы ты перевёл свой гениальный роман с русского на эсперанто. JVM — тот самый универсальный читатель, который этот эсперанто понимает. Исходники (*.java`) — это для тебя, а байт-код — уже для машины. Всё, приехали.
  2. Архив, он же в 99% случаев JAR-файл. Это такой цифровой чемодан, куда все эти .class-файлы, картинки, конфиги и прочую требуху аккуратненько запихивают. А ещё туда засовывают бумажку MANIFEST.MF — типа инструкция, что к чему.

И в чём же, сука, соль всего этого?

  • Портативность, ёпта! Собрал на своей тачке под Windows — выкатил JAR на сервер с линуксом, и он там, блядь, запускается! Главное, чтобы JVM подходящая была. Красота, а не жизнь.
  • Манифест — голова всему. В этой самой бумажке MANIFEST.MF можно указать главный класс, с которого всё начинается (Main-Class). Без этого иногда как об стенку горох — запускаешь JAR, а он тебе: «А че делать-то, мудила?».
  • Про зависимости отдельная песня. В обычном, так сказать, «тощем» JAR'е твоих библиотек нет. Их надо рядом класть и в classpath прописывать, а то будет овердохуища ошибок. А вот в жирном (fat) JAR'е, как любят делать в Spring Boot, — там внутри уже всё, включая кухонную раковину. Один файл — и поехали. Удобно, пиздец.

Ну и как эту радость в дело пустить?

# Если ты ещё не упаковался и бегаешь с пачкой class-файлов
java -cp "target/classes" com.example.Main

# А вот это уже цивилизованно — дал по JAR'у
java -jar target/my-application.jar

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