如何通过 CMD 启动 JavaFX 程序?
How do I launch JavaFX program through CMD?
我使用 javafx 创建了一个小项目。在 Intellij idea 中它工作得很好。但是当我构建它并尝试 运行 by
java -jar d:\program.jar
在 window 的命令提示中它给了我 错误:JavaFX 运行时间组件丢失,运行 此应用程序需要 .
我也试过了
java -jar d:\program.jar --module-path d:\javafx\lib --add-modules javafx.controls,javafx.fxml
但是也没用
有什么想法吗?
自 Java 11 起,JavaFX 运行time 已从 JDK 中删除,现在它是自己独立的模块。这意味着您需要在 JAR 文件(fat jar)中捆绑 JavaFX 的要求。请注意 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+,你可以通过 运行ning java --version
检查):
java --module-path ${PATH_TO_FX} --add-modules javafx.controls,javafx.graphics,javafx.fxml,javafx.web -jar MyApp.jar
其中使用 --add-modules
参数添加的模块是满足您特定需求的必需模块,${PATH_TO_FX}
变量是 JavaFX 运行 所在的路径可以查到时间
请注意,此方法要求您的客户在其系统上安装 JavaFX 运行time 'installed'(和 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
我使用 javafx 创建了一个小项目。在 Intellij idea 中它工作得很好。但是当我构建它并尝试 运行 by
java -jar d:\program.jar
在 window 的命令提示中它给了我 错误:JavaFX 运行时间组件丢失,运行 此应用程序需要 .
我也试过了
java -jar d:\program.jar --module-path d:\javafx\lib --add-modules javafx.controls,javafx.fxml
但是也没用
有什么想法吗?
自 Java 11 起,JavaFX 运行time 已从 JDK 中删除,现在它是自己独立的模块。这意味着您需要在 JAR 文件(fat jar)中捆绑 JavaFX 的要求。请注意 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+,你可以通过 运行ning java --version
检查):
java --module-path ${PATH_TO_FX} --add-modules javafx.controls,javafx.graphics,javafx.fxml,javafx.web -jar MyApp.jar
其中使用 --add-modules
参数添加的模块是满足您特定需求的必需模块,${PATH_TO_FX}
变量是 JavaFX 运行 所在的路径可以查到时间
请注意,此方法要求您的客户在其系统上安装 JavaFX 运行time 'installed'(和 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