Ответ
Результат компиляции
Стандартный компилятор javac преобразует .java файлы в байт-код, сохраняемый в файлы с расширением .class. Эти файлы не являются нативными исполняемыми файлами и требуют для запуска JVM (Java Virtual Machine).
javac Main.java # Создает Main.class
java Main # Запуск байт-кода в JVM
Создание нативного исполняемого файла
Для создания самостоятельного исполняемого файла (.exe, .app, .deb и т.д.) используются следующие инструменты:
-
jpackage(JDK 14+) – стандартный инструмент для создания нативных установщиков.# Создает .msi для Windows или .deb для Linux jpackage --name MyApp --input ./lib --main-jar app.jar --main-class com.example.Main -
jlink(для модульных приложений) – создает минимальную пользовательскую JVM, включающую только необходимые модули.jlink --module-path $JAVA_HOME/jmods:mods --add-modules com.myapp --output custom-jre -
GraalVM Native Image – компилирует Java-приложение Ahead-of-Time (AOT) в нативный бинарник, не требующий JVM.
native-image -jar app.jar myapp-executable -
Сторонние утилиты (устаревший подход):
- Launch4j – обертка для Windows, создающая
.exe-файл, который запускает jar-архив. - Сборка в скрипты (
.sh,.bat), которые вызываютjava -jar.
- Launch4j – обертка для Windows, создающая
Выбор инструмента зависит от требований: jpackage — для установщиков, jlink — для уменьшения размера, GraalVM — для максимальной производительности и минимального времени запуска.
Ответ 18+ 🔞
А, ну вот, классика! Сидишь ты такой, пишешь на Java, всё работает, и тут бац — тебе говорят: «А сделай-ка нам нативный бинарник, чтоб без этой твоей JVM запускался». И ты такой: «Э, погодите, а как, блядь?»
Так вот, слушай сюда, разбираемся по полочкам, чтобы твоя башка не взорвалась.
Что у нас обычно происходит?
Берёшь ты свой .java файл, кидаешь его в javac, и он тебе выплёвывает эту самую хуйню — байт-код в файлах .class. Это не программа, которую можно ткнуть и запустить. Это как полуфабрикат, которому нужна духовка. А духовка — это JVM (Java Virtual Machine). Без неё нихуя не запустится.
javac Main.java # Получаем Main.class — наш полуфабрикат
java Main # Запускаем его в духовке (JVM)
А теперь, сука, главный вопрос: как сделать нормальную котлету, которую можно сразу в рот?
То есть, нативный исполняемый файл (.exe, или что там у тебя). Вариантов — овердохуища, выбирай по потребностям.
-
jpackage(JDK 14+) — это как штатный упаковщик, который сделает тебе красивую коробку с инструкцией (установщик). Хочешь.msiдля Винды или.debдля Линукса? Пожалуйста.jpackage --name MyApp --input ./lib --main-jar app.jar --main-class com.example.MainОн сам всё соберёт, упакует, и пользователю останется только установить. Удобно, ёпта.
-
jlink(для модульных приложений) — а это для тех, кто хочет сэкономить место. Зачем таскать с собой всю JVM, если нужна только её половина? Эта штука соберёт тебе кастомную, обрезанную JRE, куда войдут только те модули, которые ты реально используешь.jlink --module-path $JAVA_HOME/jmods:mods --add-modules com.myapp --output custom-jreПолучится папка
custom-jre. Размером меньше, запускается так же. Элегантно, блядь. -
GraalVM Native Image — вот это, сука, настоящая магия! Это когда ты берёшь своё приложение и заранее (Ahead-of-Time) компилируешь его в нативный бинарник. Никакой JVM в рантайме не нужно вообще! Запустил — и оно сразу полетело.
native-image -jar app.jar myapp-executableПолучаешь файлик
myapp-executable. Время запуска — пиздец как быстро, потребление памяти — меньше. Но есть нюансы, не всё совместимо. Зато круто звучит: «У нас нативное приложение». -
Всякое старьё и костыли — Launch4j, скрипты-обёртки (
.bat/.sh), которые просто вызываютjava -jar. Это как прикрутить к полуфабрикату инструкцию «разогрей в духовке». Не нативно, но иногда сойдёт.
Так что же выбрать, ёпта?
- Хочешь установщик для пользователей —
jpackage. - Хочешь уменьшить размер дистрибутива —
jlink. - Хочешь максимальную производительность и скорость запуска, готов к танцам с бубном — GraalVM Native Image.
- Тебе просто похуй, главное чтобы работало — пиши скрипт и иди пить чай.
Вот и вся наука. Выбирай инструмент под задачу, а не потому что он модный. И да пребудет с тобой сила, и терпения ебать больше нуля.