当前位置: 首页 > 知识库问答 >
问题:

为什么我的JavaFX应用程序的运行时映像(由jlink组装)不能正常启动和工作?

牛经赋
2023-03-14

我有一个简单的JavaFX网络浏览器,它是一个模块。模块的目录结构是:

webBrowser
webBrowser/module-info.java
webBrowser/webbrowser
webBrowser/webbrowser/WebBrowser.java

以下是模块信息的代码.java

module webBrowser {
    requires javafx.controls;
    requires javafx.web;
    exports webbrowser;
}

以下是WebBrowser.java的代码:

package webbrowser;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.web.WebView;
import javafx.scene.web.WebEngine;
import javafx.stage.Stage;

public class WebBrowser extends Application {

    @Override
    public void start(Stage stage) {
        WebView browser = new WebView();
        WebEngine webEngine = browser.getEngine();
        webEngine.load("http://www.oracle.com");
        Scene scene = new Scene(browser, 1200, 900);
        stage.setScene(scene);
        stage.show();
    }

    public static void main(String[] args) {
        launch();
    }
}

我用javac编译我的模块化应用程序:

% javac -d out --module-source-path . --module-path $JAVAFX --module webBrowser

我可以用java启动我的应用程序,它运行良好:

% java --module-path out:$JAVAFX/lib --module webBrowser/webbrowser.WebBrowser

当我试图使用jlink组装我的模块(webBrowser)和JavaFX模块时,问题就出现了:

% jlink --module-path out:$JAVAFX/lib --add-modules webBrowser,javafx.controls,javafx.web --output myjre
% myjre/bin/java --list-modules
java.base@17.0.1
java.datatransfer@17.0.1
java.desktop@17.0.1
java.net.http@17.0.1
java.prefs@17.0.1
java.xml@17.0.1
javafx.base
javafx.controls
javafx.graphics
javafx.media
javafx.web
jdk.jsobject@17.0.1
jdk.unsupported@17.0.1
jdk.xml.dom@17.0.1
webBrowser
% myjre/bin/java --module webBrowser/webbrowser.WebBrowser
Graphics Device initialization failed for :  es2, sw
Error initializing QuantumRenderer: no suitable pipeline found
java.lang.RuntimeException: java.lang.RuntimeException: Error initializing QuantumRenderer: no suitable pipeline found
    at javafx.graphics/com.sun.javafx.tk.quantum.QuantumRenderer.getInstance(QuantumRenderer.java:283)
    at javafx.graphics/com.sun.javafx.tk.quantum.QuantumToolkit.init(QuantumToolkit.java:254)
    at javafx.graphics/com.sun.javafx.tk.Toolkit.getToolkit(Toolkit.java:264)
    at javafx.graphics/com.sun.javafx.application.PlatformImpl.startup(PlatformImpl.java:291)
    at javafx.graphics/com.sun.javafx.application.PlatformImpl.startup(PlatformImpl.java:163)
    at javafx.graphics/com.sun.javafx.application.LauncherImpl.startToolkit(LauncherImpl.java:659)
    at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:410)
    at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:364)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:568)
    at java.base/sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.java:1071)
Caused by: java.lang.RuntimeException: Error initializing QuantumRenderer: no suitable pipeline found
    at javafx.graphics/com.sun.javafx.tk.quantum.QuantumRenderer$PipelineRunnable.init(QuantumRenderer.java:95)
    at javafx.graphics/com.sun.javafx.tk.quantum.QuantumRenderer$PipelineRunnable.run(QuantumRenderer.java:125)
    at java.base/java.lang.Thread.run(Thread.java:833)
Exception in thread "main" java.lang.reflect.InvocationTargetException
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:568)
    at java.base/sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.java:1071)
Caused by: java.lang.RuntimeException: No toolkit found
    at javafx.graphics/com.sun.javafx.tk.Toolkit.getToolkit(Toolkit.java:276)
    at javafx.graphics/com.sun.javafx.application.PlatformImpl.startup(PlatformImpl.java:291)
    at javafx.graphics/com.sun.javafx.application.PlatformImpl.startup(PlatformImpl.java:163)
    at javafx.graphics/com.sun.javafx.application.LauncherImpl.startToolkit(LauncherImpl.java:659)
    at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:410)
    at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:364)
    ... 5 more

运行链接的应用程序(如上)时,我得到以下RuntimeException:

java.lang.RuntimeException: Error initializing QuantumRenderer: no suitable pipeline found

组装注意事项

我使用jlink组装三个模块:javafx.controls、javafx.web和webBrowser。

问题

我的应用程序在Java上运行良好。当我使用以下命令时,它启动并正常工作:

% java --module-path out:$JAVAFX/lib --module webBrowser/webbrowser.WebBrowser

但当我尝试启动运行时映像时,收到一条错误消息(初始化QuantumRenderer时出错:找不到合适的管道):

% myjre/bin/java --module webBrowser/webbrowser.WebBrowser

为什么在尝试启动运行时映像时收到此错误消息?如何让我的 Web 浏览器正确组装和启动?

共有1个答案

赫连照
2023-03-14

请参阅openjfx tracker中的相关问题,并尝试遵循其中的建议和故障排除步骤。

特别是本节介绍下载和使用mod文件而不是sdk。

原因是您正在捆绑SDK中的“mod ”,其中没有本地库(在SDK中,我们有jar和本地库)。

您可以将 JavaFX 模块下载为 jmod,包括类和本机库。

请参见:

    < Li > https://gluohq . com/products/Java FX/

并下载模组(而不是 SDK)。

接下来,将jlink指向mods目录

显然,SDK打包与Maven等其他发行版类型不同。SDK 打包将 Java 类和本机库分开,而针对其他交付平台的打包则没有,这就是为什么您可以针对 SDK 执行,但不能针对它进行链接的原因。

请参阅openjfx文档部分,了解如何从命令行创建运行时。jlink命令中使用的路径如下

--module-path $PATH_TO_FX_MODS:mods

--module-path out:$JAVAFX/lib
 类似资料:
  • 这是:“Parent root=fxmlloader.load(getClass().getResource(”sample.fxml“));” 我不明白剩下的部分,所以我希望你能轻松地解决这个问题:)

  • 我使用react和laravel开发了一个应用程序来显示酒店列表。当用户点击一个单一的酒店,我希望该酒店的细节显示在一种类型的‘单一’视图。然而,尽管在主列表视图中,我使用正确的路由模式链接到单个页面,并且我在路由器中定义了该模式,但当我单击该链接时,我会被带到一个“404 not found”页面。 编辑文章的编辑链接也是如此。 任何关于如何解决这个问题的想法都将非常感谢! 谢谢, 罗伯特·杨

  • 我是react native的新手,我正在尝试使用android Studio开始我的第一个项目。我遵循react native的“设置开发环境”中的说明,最终使用 然后我在android studio中打开了我的项目来启动AVD,但是gradle抛出了以下错误 错误:评估脚本时出现问题。 无法运行程序“node”(在目录“/home/deadshot/documents/playground/a

  • 按下开始按钮后,它运行程序,但它不允许我使用右下角的退出按钮,我不知道为什么它会这样做。有人能帮忙吗。我希望它继续运行该程序,但仍然允许我使用该按钮,因此,如果我想中途退出,它将允许我。项目描述:“对于我的项目,我将使用python创建一个随机迷宫生成软件。我将创建一个网格呈现给用户。该软件将从左上角开始,然后创建迷宫,沿随机方向运行,最后在右下角结束。”

  • 我有一个主活动MainActivity,它是我的android应用程序的入口点。它通过发射器正确发射。然而,当我尝试执行startActivity时,我看到活动试图启动的一些调试,一些代码正确启动,但MainActivity从未启动。 我认为这可能与意图有关: 对吗? 从内部活动来看,我有 我甚至看到 10-11 22:23:46.026:INFO/ActivityManager(472):从pi

  • 我想让我的Javafx FXML应用程序开始最大化,所以我在我的阶段中使用了方法。 程序以最大化方式打开没有问题,但问题是在窗口出现之前,有一个小的黑色区域在应用程序启动时闪烁半秒。 我发现问题出在这个场景上,因为它试图在prefWidth和prefHeight中打开,然后它向上缩放以适应舞台。我怎样才能修复这一点,使程序像正常程序一样启动? 下面是我的start()方法: