Как запустить jar-файл Java
Что проверяют
Понимаете ли вы, что происходит при запуске: откуда JVM берёт главный класс и зависимости, куда писать параметры JVM, а куда аргументы приложения. Следом обычно спрашивают, как запустить jar без манифеста или почему приложение падает с NoClassDefFoundError.
Как отвечать
Базовая команда java -jar app.jar. Она работает, только если в META-INF/MANIFEST.MF указан Main-Class, иначе будет ошибка no main manifest attribute, in app.jar. Порядок аргументов важен:
java -Xmx512m -Dspring.profiles.active=prod -jar app.jar --server.port=8081Всё до -jar получает JVM, всё после имени файла уходит в main(String[] args).
Что ещё назвать:
- зависимости: при
-jarключ-cpи переменнаяCLASSPATHигнорируются. Библиотеки либо перечислены вClass-Pathманифеста, либо упакованы внутрь fat jar черезmaven-shade-pluginили плагин Spring Boot, который кладёт их вBOOT-INF/libи запускает свой загрузчик; - запуск без манифеста:
java -cp "app.jar:lib/*" com.example.Main, на Windows разделитель;; - версия: Java на сервере должна быть не старше той, под которую собран код, иначе
UnsupportedClassVersionError(версия класс-файла 61 это Java 17, 65 это Java 21); - прод: jar запускают юнитом systemd или в контейнере через
ENTRYPOINT ["java", "-jar", "/app/app.jar"], память ограничивают через-XX:MaxRAMPercentage.
С Java 11 одиночный исходник запускается без отдельной компиляции командой java Main.java, но к jar это отношения не имеет.
Где спотыкаются
Пишут -Xmx или -D после имени jar. JVM их не видит, они уходят приложению как обычные аргументы.
Добавляют -cp "lib/*" к java -jar и удивляются NoClassDefFoundError. С -jar classpath берётся только из манифеста.
Собирают тонкий jar обычным mvn package без shade и запускают его на сервере без библиотек. Нужно либо собирать fat jar, либо везти зависимости рядом и прописывать их в манифест.