Ответ
Результатом сборки Java-приложения является переносимый байт-код и, как правило, упакованный артефакт для запуска.
Основные результаты:
- *Байт-код (`.class
файлы)** — результат компиляции исходного кода (*.java`). Этот байт-код выполняется JVM. - Архив приложения (чаще всего 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-приложение, накодил, настрадался, и что в сухом остатке, спрашивается? А остаётся, блядь, магия переносимости, вот что!
Что у тебя в коробке после всей этой движухи:
- *Байт-код, эти самые `.class
файлы.** Это как если бы ты перевёл свой гениальный роман с русского на эсперанто. JVM — тот самый универсальный читатель, который этот эсперанто понимает. Исходники (*.java`) — это для тебя, а байт-код — уже для машины. Всё, приехали. - Архив, он же в 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
Вот и вся магия, блядь. Написал, собрал, запаковал — и пошла плясать губерния на любой платформе. Главное, чтобы в манифесте не накосячить, а то будет «вротберунчик» вместо запуска.