【发布时间】:2021-02-09 05:13:46
【问题描述】:
我有一个用 Java 8 编译的可执行 jar 文件,其中包含一个名为 app.jar 的 JavaFX 应用程序。
当我安装了 Java 8 后,我可以简单地使用 java -jar app.jar 运行它。
现在我只安装了 Java 11,运行上面的命令会产生以下错误:
Error: Could not find or load main class <...>
Caused by: java.lang.NoClassDefFoundError: javafx/application/Application
因为 Java 11 不再包含 JavaFX。
所以我考虑安装 JavaFX。 openjfx.org 以两种形式提供 JavaFx:SDK 和 JMOD 文件。
我认为我不需要 SDK,因为我不是在创建 JavaFX,而只是在运行一个。这将 JMOD 文件作为剩余选项。
但是,the Oracle documentation on JMODs 说:“JMOD 文件格式让您可以聚合 .class 文件、元数据和资源以外的文件。这种格式是可传输的,但不可执行,这意味着您可以在编译时或链接期间使用它time 但不是在运行时,”所以它们似乎不会帮助我运行应用程序。
问题:
- 如何使用 Java 11 运行时运行上述定义的
app.jar? - 是否有任何文档说明如何执行此操作,如果有,在哪里执行?
【问题讨论】:
-
@Sedrick 你可以。他们专门创建了“未命名模块”的概念,以允许预模块/非模块化代码在 Java 9+ 上运行。
-
JMOD 文件仅用于编译时和链接时(即
jlink);你不能在运行时使用它们。您要么需要 SDK,要么下载包含 JavaFX 的 JRE 发行版(那里有几个)。如果您选择后者,那么 JavaFX 应用程序的运行方式与以前相同。如果您选择前者,那么您将需要java --module-path <PATH_TO_SDK> -jar app.jar之类的非模块化应用程序。请注意,如果您创建运行时映像 (jlink),那么您将希望使用 JMOD 文件,因为它们比 Maven Central 的 JAR 更好地处理本机代码。 -
正如 Slaw 所指出的,这可能是 Run HelloWorld using JavaFX 加上 how to run a jar file 的步骤,例如如果你从命令行运行一个类文件也是一样的,除了你将
-jar添加到java命令并且你需要提供模块(因为它们不在openjfx发行版中)并设置正确的模块路径。 -
如果可以的话,也可以试试Liberica Java distribution。我认为 Liberica 包含开箱即用的 JavaFX,因此您的 jar 可能会在其上运行,而无需单独提供 JavaFX 模块并为其添加路径。看起来 Liberica 是一个 JDK,而不是 JRE,所以它不是每个人的正确解决方案。
-
抱歉,我在给出的命令行示例中遗漏了一些内容。它实际上应该看起来像这样:
java --module-path <PATH_TO_SDK> --add-modules <FX_MODS> -jar app.jar。其中<PATH_TO_SDK>是包含JavaFX 模块(JAR 文件)的目录,<FX_MODS>是应用程序所需的JavaFX 模块(通常至少是javafx.controls,它将隐式引入javafx.graphics和javafx.base,但也可能包括其他模块,例如javafx.media,其中每个模块名称用逗号分隔)。
标签: java javafx executable-jar java-module