0

我已经用 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

请帮忙

4

1 回答 1

0

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

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

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

您需要 JMOD 文件,因为它们将本机代码(和其他东西,例如许可证)与 Java 代码打包在一起。这允许jlink(在幕后使用jpackage)优雅地将本机代码包含在自定义运行时映像中。此外,不要忘记 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,但我怀疑你需要一切

  • 不是肯定的,但我相信如果你Main-Class的 JAR 文件清单中有一个属性,那么--main-class就不需要了。

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

    --java-options="--add-exports javafx.graphics/com.sun.javafx.sg.prism=ALL-UNNAMED"
    
  • 如果你让你的代码模块化,你也可以摆脱这个--add-modules论点。取而代之的是,您将模块(以及任何不在 JDK 中的模块)放在--module-pathand 替换--input,--main-jar--main-classwith --module-pathand上--module

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

有关更多信息,请参阅JPackage 用户指南。本答案中未提及指南中描述的许多自定义应用程序的方法。

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

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