【问题标题】:JVM not found when launching a JavaFx app deployed with jpackage and installed启动使用 jpackage 部署并安装的 JavaFx 应用程序时找不到 JVM
【发布时间】:2021-01-23 17:11:55
【问题描述】:

我已经用 jpackage 打包了一个 JavaFx (14) 项目,以便在 .exe 设置中部署。

项目依赖为:

  • Java 14.0.2
  • JavaFx 14.0.2.1
  • JRE 1.8.0_271(已删除

因此,在我在几台机器(大约 6 台)上部署期间,它在几台机器上成功,但在其他机器上我有这个错误:

JVM can not launch

尽管所有依赖项都已正确安装在这些机器上,并且环境变量定义良好。

谁能帮帮我


经过一些修复(由@Slaw@mipa提到,我生成了一个新包,安装它。但是当我运行软件(myApp.exe)时,我有这个错误

Failed to lunch JVM

经过一些研究,解决方案是使用 java 命令创建一个批处理文件,该命令将运行位于 C:\Program Files\ 软件文件夹中的 .jar 文件

cd "C:\Program Files\software\app"
java --module-path "C:\Program Files\Java\javafx-sdk-14.0.2.1\lib" --add-modules=ALL-MODULE-PATH --add-exports javafx.graphics/com.sun.javafx.sg.prism=ALL-UNNAMED -jar software.jar

我已经完成了,软件运行得很好,但是有没有其他优化方案可以直接运行软件而不需要批处理文件?

因为在某些计算机上,批处理没有运行软件,返回同样的错误:Failed to lunch JVM

请帮忙

【问题讨论】:

  • 如果您使用 Java/JavaFX 14 进行开发,为什么还要使用 JRE 8?我也不清楚你如何使用jpackage,但不知何故依赖于 JRE 8(或任何外部 JRE)。
  • 当您正确使用 jpackage 创建一个 .exe 时,您将不再对您的部署目标有任何依赖。正如@Slaw 已经说过的 - 你的整个设置看起来很奇怪。
  • @Slaw 感谢您的评论,我刚刚读到 Java 运行时环境已停止使用 Java 11。由于 14 > 11,Java 14 没有 JRE。所以我会修复它。
  • 好吧@mipa 我会修复我的设置并再次尝试使用 jpackage 打包
  • 如果您必须手动添加--module-path--add-modules,那么您在打包应用程序时未能包含JavaFX。简而言之,您需要告诉jpackage 包括JavaFX。确保将其指向 JMOD 文件而不是 JAR 文件。您可以从获得 JavaFX SDK(即 Gluon)的同一位置获得 JMOD 文件。您可能也希望阅读此内容:docs.oracle.com/en/java/javase/15/jpackage/…

标签: java javafx deployment jpackage


【解决方案1】:

如果您必须使用--module-path--add-modules 手动启动应用程序,那么您在打包应用程序时未能包含JavaFX,或者至少未能正确包含JavaFX。请记住,JavaFX 是模块化的,即使您的代码不是。因此,当您打包应用程序时,您应该告诉jpackage 将 JavaFX 视为模块。

首先,您应该获取 JavaFX JMOD 文件。您可以通过至少两种方式之一获得它们:

  1. 从 Gluon 下载 JMOD 文件(与您下载 JavaFX SDK 的位置相同)。
  2. 安装和使用包含 JavaFX 的 JDK(例如来自 Zulu Community、BellSoft Liberica 等)。
    • 使用此选项,您无需 JavaFX SDK 即可开始使用。

您需要 JMOD 文件,因为它们将本机代码(以及其他内容,例如许可证)与 Java 代码打包在一起。这允许jlinkjpackage 在幕后使用)优雅地将本机代码包含在自定义运行时映像中。此外,不要忘记 JavaFX(以及扩展的 JMOD 文件)是特定于平台的。而jpackage 只能为调用它的操作系统创建应用程序。

获得 JMOD 文件后,您需要打包您的应用程序。假设您的代码不是模块化的(您在问题中使用-jar)并且您已将代码打包到 JAR 文件中。以下命令应该是您使用jpackage 所需的最低要求:

jpackage --type app-image --module-path <path-to-jmods> --add-modules <needed-modules> 
         --input <dir-containing-your-jar-file> --main-jar <your-jar-file>
         --main-class <your-main-class> --dest <your-output-location>

一些注意事项:

  • 如果您安装并使用包含 JavaFX 的 JDK,则不需要--module-path。至少对于 JavaFX 来说不是。

  • 我不确定您的应用程序需要哪些模块(--add-modules 选项)。你使用ALL-MODULE-PATH,但我怀疑你需要一切

  • 不是肯定的,但我相信如果您的 JAR 文件清单中有 Main-Class 属性,则不需要 --main-class

  • 如果您确实需要 --add-exports 参数,那么您可以使用:

    --java-options="--add-exports javafx.graphics/com.sun.javafx.sg.prism=ALL-UNNAMED"
    
  • 如果你让你的代码模块化,你也可以去掉--add-modules 参数。相反,您可以将您的模块(以及任何不在 JDK 中的模块)放在 --module-path 上,并将 --input--main-jar--main-class 替换为 --module-path--module

    • 在这种情况下--input 似乎不再需要。但是,如果您的应用程序需要其他文件(例如安全策略文件),那么您可能仍需要 --input

请参阅JPackage User Guide 了解更多信息。指南中描述了许多自定义应用程序的方法,但此答案中未提及。

如果这一切仍然不能解决每台计算机上的“无法启动 JVM”错误,那么您将需要进行进一步的调试。您想要的第一件事是了解导致问题的实际错误。我至少可以想到两种方法:

  1. 将日志记录添加到您的应用程序。记录到文件。
  2. 配置jpackage 使您的应用程序基于控制台。然后从控制台启动应用程序以查看任何输出。如果您在查看输出时遇到问题,则可以将标准/错误流重定向到文件或使用告诉控制台不要打开新窗口的选项。

【讨论】:

  • 我已经将我的 jpackage 命令调整为:jpackage --type app-image --module-path "C:\Program Files\Java\javafx-jmods-15.0.1" --add-modules javafx.controls,javafx.fxml,javafx.web,java.logging --input C:\Users\ngnou\OneDrive\Documents\NetBeansProjects\EBB-App\dist --main-jar EBB-App.jar --main-class ebbapp.Main --dest C:\Users\ngnou\OneDrive\Documents\NetBeansProjects\Deploy --java-options "--add-exports javafx.graphics/com.sun.javafx.sg.prism=ALL-UNNAMED"
  • 图片已经生成好了,但是当我运行Main.exe时,什么也没有发生,它没有运行应用程序。
  • 即使安装了 .exe 包,也无法运行当运行java -jar EBB-App.jar(路径是C:上的软件应用程序文件夹)时,返回:Error: JavaFX runtime components are missing, and are required to run this application
  • 我无法重现该问题。我测试了我在答案中输入的jpackage 命令,它对我有用。您是否指向 JMOD 文件? SDK 中的 JAR 文件不包含本机代码。 JMOD 文件可以。 来自 Maven Central 的 JAR 文件也是如此,但这不像 JMOD 文件那样干净。您是否尝试过答案末尾的调试建议?此外,如果您下载“完整 JDK”,BellSoft Liberica 确实包含 JavaFX。
  • 再看你上一条评论,你为什么用&gt; java -jar EBB-App.jar?您已经创建了一个可执行文件。你应该做类似&gt; app-name.exe的事情。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-12
  • 1970-01-01
  • 2020-11-28
  • 1970-01-01
  • 2019-12-27
相关资源
最近更新 更多