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

«Что является результатом компиляции Java-кода и как создать нативный исполняемый файл?» — вопрос из категории Java Core, который задают на 10% собеседований 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 — для максимальной производительности и минимального времени запуска.