Как мне запустить программу JavaFX через CMD?

#java #javafx

#java #javafx

Вопрос:

Я создал небольшой проект с использованием javafx. В Intellij idea это работает просто отлично. Но когда я построил его и попытался пробежать мимо

 java -jar d:program.jar
 

в командной строке окна promt это выдало мне ошибку: компоненты среды выполнения JavaFX отсутствуют и необходимы для запуска этого приложения.

Я тоже пытался

 java -jar d:program.jar --module-path d:javafxlib --add-modules javafx.controls,javafx.fxml
 

но это тоже не сработало

Есть идеи?

Комментарии:

1. -jar Опция появляется последней. Все, что находится после файла JAR, считается аргументами вашего приложения.

Ответ №1:

Начиная с Java 11, среда выполнения JavaFX была удалена из JDK, и теперь это ее собственный отдельный модуль. Это означает, что вам нужно объединить требования к JavaFX в вашем JAR-файле (fat jar). Обратите внимание, что требования JavaFX зависят от платформы, что означает, что вам, вероятно, потребуется создать отдельные файлы JAR для каждой платформы, на которую вы ориентируетесь. Для Gradle это будет выглядеть примерно так:

 ...
def currentOS = DefaultNativePlatform.currentOperatingSystem;
def platform
if (currentOS.isWindows()) {
    platform = 'win'
} else if (currentOS.isLinux()) {
    platform = 'linux'
} else if (currentOS.isMacOsX()) {
    platform = 'mac'
}

dependencies {
    implementation "org.openjfx:javafx-base:15.0.1:${platform}"
    implementation "org.openjfx:javafx-controls:15.0.1:${platform}"
    implementation "org.openjfx:javafx-graphics:15.0.1:${platform}"
    implementation "org.openjfx:javafx-fxml:15.0.1:${platform}"
    ...
}
 

С другой стороны, если вы работаете с модульным проектом (Java 9 ), вам нужно будет добавить необходимые модули при выполнении приложения. Например, для запуска файла JAR (убедитесь, что вы используете Java 9 , вы можете проверить это, выполнив java --version ):

 java --module-path ${PATH_TO_FX} --add-modules javafx.controls,javafx.graphics,javafx.fxml,javafx.web -jar MyApp.jar
 

Где модули, которые были добавлены с помощью --add-modules argument, являются необходимыми модулями для ваших конкретных нужд, а ${PATH_TO_FX} переменная — это путь, по которому можно найти среду выполнения JavaFX.

Обратите внимание, что этот метод требует, чтобы у ваших клиентов была «установлена» среда выполнения JavaFX (и JRE) в их системах, и, вообще говоря, это больше не рекомендуемый способ распространения вашего Java-приложения.

Если вы используете Maven или Gradle, есть отличные плагины, доступные для создания jlink-образов, содержащих ваш модульный проект и все зависимости, включая JRE, оптимизированную для вашего приложения и модулей JavaFX. Это, вообще говоря, рекомендуемый способ распространения приложений Java 9 среди ваших клиентов. Рассматриваемые плагины:

https://badass-jlink-plugin.beryx.org/releases/latest/
https://maven.apache.org/plugins/maven-jlink-plugin/

Для этого требуется создать module-info.java файл: https://openjdk.java.net/projects/jigsaw/quick-start