Что является результатом компиляции Java-кода и как создать нативный исполняемый файл?

Ответ

Результат компиляции

Стандартный компилятор javac преобразует .java файлы в байт-код, сохраняемый в файлы с расширением .class. Эти файлы не являются нативными исполняемыми файлами и требуют для запуска JVM (Java Virtual Machine).

javac Main.java # Создает Main.class
java Main       # Запуск байт-кода в JVM

Создание нативного исполняемого файла

Для создания самостоятельного исполняемого файла (.exe, .app, .deb и т.д.) используются следующие инструменты:

  1. jpackage (JDK 14+) – стандартный инструмент для создания нативных установщиков.

    # Создает .msi для Windows или .deb для Linux
    jpackage --name MyApp --input ./lib --main-jar app.jar --main-class com.example.Main
  2. jlink (для модульных приложений) – создает минимальную пользовательскую JVM, включающую только необходимые модули.

    jlink --module-path $JAVA_HOME/jmods:mods --add-modules com.myapp --output custom-jre
  3. GraalVM Native Image – компилирует Java-приложение Ahead-of-Time (AOT) в нативный бинарник, не требующий JVM.

    native-image -jar app.jar myapp-executable
  4. Сторонние утилиты (устаревший подход):

    • Launch4j – обертка для Windows, создающая .exe-файл, который запускает jar-архив.
    • Сборка в скрипты (.sh, .bat), которые вызывают java -jar.

Выбор инструмента зависит от требований: jpackage — для установщиков, jlink — для уменьшения размера, GraalVM — для максимальной производительности и минимального времени запуска.

Ответ 18+ 🔞

А, ну вот, классика! Сидишь ты такой, пишешь на Java, всё работает, и тут бац — тебе говорят: «А сделай-ка нам нативный бинарник, чтоб без этой твоей JVM запускался». И ты такой: «Э, погодите, а как, блядь?»

Так вот, слушай сюда, разбираемся по полочкам, чтобы твоя башка не взорвалась.

Что у нас обычно происходит? Берёшь ты свой .java файл, кидаешь его в javac, и он тебе выплёвывает эту самую хуйню — байт-код в файлах .class. Это не программа, которую можно ткнуть и запустить. Это как полуфабрикат, которому нужна духовка. А духовка — это JVM (Java Virtual Machine). Без неё нихуя не запустится.

javac Main.java # Получаем Main.class — наш полуфабрикат
java Main       # Запускаем его в духовке (JVM)

А теперь, сука, главный вопрос: как сделать нормальную котлету, которую можно сразу в рот? То есть, нативный исполняемый файл (.exe, или что там у тебя). Вариантов — овердохуища, выбирай по потребностям.

  1. jpackage (JDK 14+) — это как штатный упаковщик, который сделает тебе красивую коробку с инструкцией (установщик). Хочешь .msi для Винды или .deb для Линукса? Пожалуйста.

    jpackage --name MyApp --input ./lib --main-jar app.jar --main-class com.example.Main

    Он сам всё соберёт, упакует, и пользователю останется только установить. Удобно, ёпта.

  2. jlink (для модульных приложений) — а это для тех, кто хочет сэкономить место. Зачем таскать с собой всю JVM, если нужна только её половина? Эта штука соберёт тебе кастомную, обрезанную JRE, куда войдут только те модули, которые ты реально используешь.

    jlink --module-path $JAVA_HOME/jmods:mods --add-modules com.myapp --output custom-jre

    Получится папка custom-jre. Размером меньше, запускается так же. Элегантно, блядь.

  3. GraalVM Native Image — вот это, сука, настоящая магия! Это когда ты берёшь своё приложение и заранее (Ahead-of-Time) компилируешь его в нативный бинарник. Никакой JVM в рантайме не нужно вообще! Запустил — и оно сразу полетело.

    native-image -jar app.jar myapp-executable

    Получаешь файлик myapp-executable. Время запуска — пиздец как быстро, потребление памяти — меньше. Но есть нюансы, не всё совместимо. Зато круто звучит: «У нас нативное приложение».

  4. Всякое старьё и костыли — Launch4j, скрипты-обёртки (.bat / .sh), которые просто вызывают java -jar. Это как прикрутить к полуфабрикату инструкцию «разогрей в духовке». Не нативно, но иногда сойдёт.

Так что же выбрать, ёпта?

  • Хочешь установщик для пользователей — jpackage.
  • Хочешь уменьшить размер дистрибутива — jlink.
  • Хочешь максимальную производительность и скорость запуска, готов к танцам с бубном — GraalVM Native Image.
  • Тебе просто похуй, главное чтобы работало — пиши скрипт и иди пить чай.

Вот и вся наука. Выбирай инструмент под задачу, а не потому что он модный. И да пребудет с тобой сила, и терпения ебать больше нуля.