【问题标题】:JavaFX deployment: Failed to launch JVMJavaFX 部署:无法启动 JVM
【发布时间】:2021-03-06 03:15:28
【问题描述】:

问候

我使用由 jpackage 创建的 msi 安装程序部署了一个简单的 JavaFX 应用程序。双击安装在 Windows 10“程序文件”目录中的应用程序图标时,会显示错误“无法启动 JVM”。在部署之前,我从命令提示符处测试了应用程序 jar 文件,没有任何问题。检查应用程序安装目录时(在“C:\Program 文件”下)它有所有运行时 dll 等等,所以我不确定是什么导致了这个错误?这是我用来构建运行时映像的 japckage 命令:
jpackage  --type msi --name FileChooser -p "%JAVAFX_HOME%\lib;%M2_REPO%;org\openjfx\mavenfxfilechooser\mavenfxfilechooser.jar" --module "org.openjfx.mavenfxfilechooser/org.openjfx.mavenfxfilechooser.FileChooserApp"

更新

按照评论部分给出的建议,我在我的机器上安装了 JMODS,并发出了一个 jpackage 命令行来指向 JMODS 文件而不是 JAVAFX_HOME,如下所示:
jpackage --type msi --name FileChooser -p "%JMODS_HOME%;%M2_REPO%;C:\Users\hrh74\Downloads\Lib\file\org\openjfx\mavenfxfilechooser" --module "org.openjfx.mavenfxfilechooser/org.openjfx.mavenfxfilechooser.FileChooserApp"

我使用 MSI 运行时映像安装了应用程序,这无疑解决了“无法启动 JVM”问题。应用程序启动了,但是,我有一个 WebView 组件,当用户单击“Yahoo”按钮时,它应该显示来自https://us.yahoo.com 的内容,当应用程序作为独立应用程序运行时,这似乎不起作用,但它当我从命令行运行 jar 文件时工作。我需要向 jpackage 添加任何内容吗?
如果需要源代码和 FXML 文件,请告诉我。
谢谢

【问题讨论】:

  • 我目前遇到了同样的问题,无法从已部署的应用程序发出请求。你是怎么解决的?
  • 我永远无法让这个工作,因为这篇文章,我被禁止使用 stackoverflow,所以我不能再发帖了。我不知道社区中的一个人如何将您拒之门外,但显然,在 Stackoverflow 中,一个人可以随心所欲地阻止某人
  • 感谢 Anthony 的回复,我想我必须构建另一个应用程序????????‍♂️
  • @AngularNinjaAvenger 你能try this solution 告诉我它是否适合你吗?

标签: javafx jpackage


【解决方案1】:

您最初的问题与缺少本机代码有关。但是您似乎已经通过使用 Gluon 提供的 JavaFX 的 JMOD 文件解决了这个问题。因此,一旦您创建了独立的应用程序,我将尝试帮助解决您关于 https://us.yahoo.com 未加载到 WebView 的其他问题。

在尝试自己加载该网站时,我遇到了与您相同的问题。虽然有时我会得到“我们正在解决问题”的页面响应,但有时整个应用程序会变得无响应,而其他时候什么都不会发生(加载似乎只是“优雅地”失败)。这也发生在其他网站上,而不仅仅是雅虎。经过一番测试,我终于能够得到以下错误:

java.lang.Throwable: SSL handshake failed
        at javafx.web/javafx.scene.web.WebEngine$LoadWorker.describeError(Unknown Source)
        at javafx.web/javafx.scene.web.WebEngine$LoadWorker.dispatchLoadEvent(Unknown Source)
        at javafx.web/javafx.scene.web.WebEngine$PageLoadListener.dispatchLoadEvent(Unknown Source)
        at javafx.web/com.sun.webkit.WebPage.fireLoadEvent(Unknown Source)
        at javafx.web/com.sun.webkit.WebPage.fwkFireLoadEvent(Unknown Source)
        at javafx.web/com.sun.webkit.network.URLLoaderBase.twkDidFail(Native Method)
        at javafx.web/com.sun.webkit.network.HTTP2Loader.notifyDidFail(Unknown Source)
        at javafx.web/com.sun.webkit.network.HTTP2Loader.lambda$didFail$18(Unknown Source)
        at javafx.web/com.sun.webkit.network.HTTP2Loader.lambda$callBackIfNotCanceled$10(Unknown Source)
        at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$10(Unknown Source)
        at java.base/java.security.AccessController.doPrivileged(Unknown Source)
        at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$11(Unknown Source)
        at javafx.graphics/com.sun.glass.ui.InvokeLaterDispatcher$Future.run(Unknown Source)
        at javafx.graphics/com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
        at javafx.graphics/com.sun.glass.ui.win.WinApplication.lambda$runLoop$3(Unknown Source)
        at java.base/java.lang.Thread.run(Unknown Source)

这表明jpackage 创建的应用程序缺少一些加密库。从这里我只是猜测,但包括:

--add-modules jdk.crypto.cryptoki,jdk.crypto.ec

运行jpackage 时似乎可以解决问题。我不知道是否需要这两个模块,或者是否只需要一个(或者如果添加其中一个会隐式添加另一个)。


旁注:滚动浏览https://us.yahoo.com 时,我经常会收到以下警告:

Mar 05, 2021 12:10:40 PM com.sun.javafx.webkit.prism.WCMediaPlayerImpl onError
WARNING: onError, errCode=0, msg=Could not create player!

还有:

Mar 05, 2021 12:10:41 PM com.sun.javafx.webkit.prism.WCMediaPlayerImpl$CreateThread run
WARNING: CreateThread ERROR: java.lang.UnsupportedOperationException: Unsupported protocol "data"

无论应用程序是如何打包的,我都会收到该警告。我不知道如何解决这个问题,或者是否有不修改JavaFX代码本身的解决方案。

【讨论】:

  • 'unsupported protocol "data"' 错误是因为媒体源(网站)将媒体作为 "data:" URI 返回。这是 HTML5 标准的一部分,因此应该受到支持(并且确实受到 JavaFX WebKit 使用的下游音频库 GStreamer 的支持)。然而,将媒体发送到 GStreamer 的 JavaFX 实现 (com.sun.media.jfxmediaimpl.platform.gstreamer.GSTPlatform.java) 将其限制为仅“文件”、“http”和“https”协议。见这里:github.com/shitapatilptc/java/blob/master/src/javafx.media/com/…
【解决方案2】:

你见过running JavaFX application after jpackage吗?尝试下载 Gluon jmods 并使用它而不是 %JAVAFX_HOME%

【讨论】:

  • 请您在您的回答中提供更多详细信息,而不仅仅是抛出一个链接以提高您的回答质量。
  • @Domino walker:感谢您的链接。我粗略地看了看,似乎它会解决我的问题。有一次,我有时间,我会试一试,然后告诉你。该答案“Slaw”的贡献者似乎知识渊博,他帮助我克服了过去的问题。
  • 您需要做的就是将 %JAVA_HOME%\lib 更改为放置 JMODs for JavaFX 的路径,该路径已从 Gluon 站点下载
  • 对我来说它适用于 JDK 14,我认为它与 JavaFX 的版本有关
  • 尝试将路径添加到已编译的类并删除“org\openjfx\mavenfxfilechooser\mavenfxfilechooser.jar”?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多