【问题标题】:InternalError running JavaFX 15 application on Windows Subsystem for LinuxInternalError 在适用于 Linux 的 Windows 子系统上运行 JavaFX 15 应用程序
【发布时间】:2021-01-23 13:01:31
【问题描述】:

我在尝试在适用于 Linux WSL2 / Ubuntu 20.04 的 Windows 子系统上运行 JavaFX 15 应用程序时遇到问题,需要有关下一步尝试的建议。

到目前为止,我已经能够在 WSL 中运行我通常在 Windows/JDK15 上执行的所有 Java 构建,包括那些具有 Swing/AWT 依赖项的构建。 AWT / Swing 测试应用程序在 WSL 中成功运行并引用 JDK15,并在 Windows 10 上运行 X Windows。但是我无法运行任何 JavaFX 应用程序,即使是 HelloFX 示例:

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;

public class HelloFX extends Application {
    public void start(Stage stage) {
        String javaVersion = System.getProperty("java.version");
        String javafxVersion = System.getProperty("javafx.version");
        Label l = new Label("Hello, JavaFX " + javafxVersion + ", running on Java " + javaVersion + ".");
        Scene scene = new Scene(new StackPane(l), 640, 480);
        stage.setScene(scene);
        stage.show();
    }
    public static void main(String[] args) {
        launch();
    }
}

我在 Windows 上尝试过各种 X 服务器 - X/Cygwin、X410、VcXsrv 和 XMing。这是使用 VcXsrv 运行 HelloFX 时的错误消息:

> echo $PATH_TO_FX
/mnt/c/linux/javafx-sdk-15/lib
> $JAVA_HOME/bin/java -version
openjdk version "15" 2020-09-15
OpenJDK Runtime Environment (build 15+36-1562)
OpenJDK 64-Bit Server VM (build 15+36-1562, mixed mode, sharing)

> $JAVA_HOME/bin/java --module-path $PATH_TO_FX --add-modules javafx.controls -cp build/classes HelloFX

libGL error: No matching fbConfigs or visuals found
libGL error: failed to load driver: swrast
Prism-ES2 Error : GL_VERSION (major.minor) = 1.4
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:64)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:564)
    at java.base/sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.java:1071)
Caused by: java.lang.UnsupportedOperationException: Internal Error
    at javafx.graphics/com.sun.glass.ui.gtk.GtkApplication.lambda$new$6(GtkApplication.java:189)
    at java.base/java.security.AccessController.doPrivileged(AccessController.java:312)
    at javafx.graphics/com.sun.glass.ui.gtk.GtkApplication.<init>(GtkApplication.java:171)
    at javafx.graphics/com.sun.glass.ui.gtk.GtkPlatformFactory.createApplication(GtkPlatformFactory.java:41)
    at javafx.graphics/com.sun.glass.ui.Application.run(Application.java:144)
    at javafx.graphics/com.sun.javafx.tk.quantum.QuantumToolkit.startup(QuantumToolkit.java:280)
    at javafx.graphics/com.sun.javafx.application.PlatformImpl.startup(PlatformImpl.java:269)
    at javafx.graphics/com.sun.javafx.application.PlatformImpl.startup(PlatformImpl.java:158)
    at javafx.graphics/com.sun.javafx.application.LauncherImpl.startToolkit(LauncherImpl.java:658)
    at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:409)
    at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:363)
    ... 5 more

其他一些网站,例如How to set up working X11 forwarding on WSL2 提到export LIBGL_ALWAYS_INDIRECT=1的使用。使用此设置,不会打印 2 条 libGL error 消息,但我得到相同的错误堆栈。

一个 swing/AWT java 应用程序从相同的 bash 运行,具有相同的 DISPLAY 运行良好,没有错误。我正在使用OpenJDK15 Linux 和Gluon JavaFX 15。我还尝试jlink 使用 JDK15 和 JavaFX 模块制作 JRE - 相同的错误消息。

按照建议,使用-Djdk.gtk.verbose=true 运行时会出现以下消息:

checking GTK version 3
trying GTK library libgtk-3.so.0
trying GTK library libgtk-3.so
trying GTK library libgtk-x11-2.0.so.0
trying GTK library libgtk-x11-2.0.so

【问题讨论】:

  • 只是出于好奇。您是否尝试使用 -Dprism.order=sw 运行
  • 按照您的建议尝试过:-Dprism.order=sw 消除了 2 个 libGL + Prism-ES2 错误消息,但获得了相同的 Java 堆栈跟踪。
  • 使用-Djdk.gtk.verbose=true 运行,它应该打印 GTK 版本和它正在尝试使用的库。
  • 我将使用-Djdk.gtk.verbose=true 添加的信息更新问题,其中提到“正在尝试 GTK 库 libgtk-3”和“libgtk-x11-2.0”
  • 感谢您的建议。在@José Pereda 提到的日志记录之后,我添加了 libgtk-3,现在可以看到 JavaFX 应用程序

标签: java javafx wsl-2


【解决方案1】:

感谢 cmets @José Pereda 和 @mipa 帮助我解决问题,添加了 libgtk-3

sudo apt install libgtk-3-0

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-06-07
    • 2020-09-14
    • 2018-06-09
    • 1970-01-01
    • 2017-12-14
    • 2021-05-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多