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



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

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

这是module-info.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浏览器正确组装和启动?

请在openjfx跟踪器中查看此相关问题,并尝试遵循建议和故障排除步骤。

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

原因是您正在将";mods";来自SDK,其中没有本地库(在SDK中,我们有jar和本地库(。

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

参见:

  • https://gluonhq.com/products/javafx/

并下载mods(而不是SDK(。

接下来,将jlink指向mods目录

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

请参阅openjfx-docs中关于从命令行创建运行时的部分。jlink命令中使用的路径是

--module-path $PATH_TO_FX_MODS:mods

不是

--module-path out:$JAVAFX/lib

最新更新