Что нужно сделать, чтобы исходный код Java превратился в исполняемый файл
Что проверяют
Знаете ли вы цепочку от исходника до запуска и понимаете ли, что «исполняемый файл» в мире Java означает не то же самое, что в C. Ответ показывает, работали ли вы со сборкой руками или только жали кнопку в среде.
Как отвечать
По шагам:
javac MyApp.javaпревращает исходник в байт-код, файлMyApp.class. Байт-код платформенно независим;java MyAppзапускает JVM, она грузит класс, проверяет байт-код и исполняет его, а горячие методы компилирует в машинный код на лету. Поэтому «JVM просто интерпретирует» неточно;- для раздачи классы пакуют в jar с манифестом, где прописан
Main-Class, и запускают черезjava -jar app.jar. Руками этоjar --create --file app.jar --main-class MyApp -C out .; - зависимости либо кладут рядом и перечисляют в classpath, либо собирают в один толстый jar, чем в реальном проекте занимается Maven или Gradle.
Настоящий бинарник получают отдельными инструментами: jlink собирает урезанный рантайм под приложение, jpackage делает нативный установщик с лаунчером, а сборка через GraalVM native-image компилирует заранее и даёт самостоятельный исполняемый файл с быстрым стартом.
Полезное дополнение: одиночный файл современный JDK умеет запускать без отдельной компиляции, командой java MyApp.java. Это удобно для скриптов, но не для доставки.
Где спотыкаются
Путают JDK и JRE. Компилятор javac есть только в JDK, отдельной поставки JRE давно нет, и урезанный рантайм для сервера собирают jlink, а не ищут установщик.
Ловят Could not find or load main class. Класс лежит в пакете, а запускают его по имени файла из своего каталога. Запускать надо полное имя вместе с пакетом относительно корня classpath, а в режиме java -jar опция -cp игнорируется, зависимости берутся из манифеста.
Ловят UnsupportedClassVersionError: собрали на свежем JDK, запускают на старом рантайме. Версию цели задают опцией --release, она заодно ограничивает доступный API, тогда как одни -source и -target позволяют собрать вызов метода, которого на старой платформе нет.