Linux 上的 JavaFX 显示“图形设备初始化失败:es2,sw”

Posted

技术标签:

【中文标题】Linux 上的 JavaFX 显示“图形设备初始化失败:es2,sw”【英文标题】:JavaFX on Linux is showing a "Graphics Device initialization failed for : es2, sw" 【发布时间】:2014-02-06 17:45:03 【问题描述】:

我刚刚开始在 Linux 上编码/测试 JavaFX 的东西,我在启动一个简单的应用程序时遇到了错误。我在 Foruns 发现很多人对此感到担忧,但我可以找到关于它发生的原因的明确解释。我想了解我的场景中缺少什么以使其正常工作。

任何建议都会非常感激。

环境信息:

java version "1.8.0-ea"
Java(TM) SE Runtime Environment (build 1.8.0-ea-b123)
Java HotSpot(TM) Client VM (build 25.0-b65, mixed mode)

Linux MYServer 2.6.21-1.3228.fc7 #1 SMP Tue Jun 12 15:37:31 EDT 2007 i686 i686 i386 GNU/Linux

例外:

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 com.sun.javafx.tk.quantum.QuantumRenderer.getInstance(QuantumRenderer.java:300)
        at com.sun.javafx.tk.quantum.QuantumToolkit.init(QuantumToolkit.java:244)
        at com.sun.javafx.tk.Toolkit.getToolkit(Toolkit.java:179)
        at com.sun.javafx.application.PlatformImpl.startup(PlatformImpl.java:210)
        at com.sun.javafx.application.LauncherImpl.startToolkit(LauncherImpl.java:653)
        at com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:314)
        at com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:305)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:483)
        at sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.java:767)
Caused by: java.lang.RuntimeException: Error initializing QuantumRenderer: no suitable pipeline found
        at com.sun.javafx.tk.quantum.QuantumRenderer$PipelineRunnable.init(QuantumRenderer.java:98)
        at com.sun.javafx.tk.quantum.QuantumRenderer$PipelineRunnable.run(QuantumRenderer.java:128)
        at java.lang.Thread.run(Thread.java:744)
Exception in thread "main" java.lang.reflect.InvocationTargetException
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:483)
        at sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.java:767)
Caused by: java.lang.RuntimeException: No toolkit found
        at com.sun.javafx.tk.Toolkit.getToolkit(Toolkit.java:191)
        at com.sun.javafx.application.PlatformImpl.startup(PlatformImpl.java:210)
        at com.sun.javafx.application.LauncherImpl.startToolkit(LauncherImpl.java:653)
        at com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:314)
        at com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:305)

【问题讨论】:

如果您使用的是 Java 8,请在下面尝试我的回答 【参考方案1】:

您应该查看this related bug 以获取有关如何解决您的问题的帮助。总之,建议是:

使用-Dprism.verbose=true 标志运行应用程序 检查生成的详细日志 它可能指向缺少图形库:在 Linux 上运行 JavaFX 需要 GTK 2.18

【讨论】:

不知道为什么,但 -Dprism.verbose=true 没有在错误消息中添加任何额外信息。无论如何,图形库肯定是我遇到的问题(当前的 GTK 2.16)。我会尝试更新它并让它工作。谢谢阿西利亚斯! @assylias 我面临着类似的问题。您能否告诉我必须使用哪个应用程序编写此命令 -Dprism.verbose=true 。我是 linux 新手。所以我不知道如何纠正这个问题。 @HARSHITASETHI 您使用java -jar blabla.jar 运行您的应用程序,只需添加-Dprism.verbose=true。如果从 IDE 运行它,则需要将其添加到 JVM 参数中。 好的,知道了。谢谢。 :) @assylias 我遇到了类似的问题。您在答案中提供的链接不再有效。我还在树莓派上安装了 GTK。问题依然存在。【参考方案2】:

你需要安装 OpenJFX:

apt-get install openjfx

然后运行程序。

【讨论】:

@FearX 这个答案已经过时了,这里的大多数答案也是如此。列出的命令将安装 latest openjfx,它与 Java 8 不兼容。我将发布一个应该解决问题的答案...如果您使用的是 Ubuntu(否则您可以使用Oracle JDK 8,如果这与您的理念等兼容)您需要特别请求 Java 8 版本。【参考方案3】:

我解决了这个问题,将 libswt-gtk-3-java 和 gkt3 添加到我的系统中。

【讨论】:

如果你在无头模式下运行,你也需要 xvfb @KrishnaKuntala 我使用了这些命令sudo apt-get update; sudo apt-get install libswt-gtk-3-java【参考方案4】:

问题可能出在您的旧 JRE 版本中,它不包含所有必需的库,例如 libprism_es2.solibglass.so,它们应该位于控制台的 /usr/lib/jvm/java-8-openjdk-amd64/jre/lib/amd64. To check if this is the issue compile your Main.java 类中

javac Main.java  
java -Dprism.verbose=true Main

输出应该是java.lang.UnsatisfiedLinkError: Can't load library: /usr/lib/jvm/java-8-openjdk-amd64/jre/lib/amd64/libprism_es2.so

从 Oracle 官方网站下载最新的 JRE,并将 lib 文件夹复制到您当前的 JRE 位置。应该够了。

【讨论】:

很好的答案。在 Fedora 上,可以通过运行dnf whatprovides <path-to-missing-library> 找到要安装的软件包的名称。然后通过dnf再次安装。我的情况是:sudo dnf install java-1.8.0-openjdk-openjfx. 注意但是 安装它(在 Fedora 29 上仅命名为 openjfx还不够(至少在 Fedora 29 上)。阅读发行版特定的自述文件,鉴于序言部分以包含something 的行结尾并且最后没有任何额外内容,您可以使用sed 1,/something/d /usr/share/doc/openjfx/README.fedora | sh 安装。【参考方案5】:

这对我来说失败了,因为我没有 gtk 库。在启用@assylias 提到的-Dprism.verbose=true 之后

我可以找到并安装以下软件包。

sudo apt-get install libgtk2.0-bin libXtst6 libxslt1.1

解决了问题

【讨论】:

【参考方案6】:

如果你和原来的提问者一样使用 Java 8,你需要安装 Oracle JDK 8(祝你好运),或者安装 OpenJFX 8 以配合 OpenJDK 8。

目前,我可以提供 Ubuntu 18.x 的确切说明。他们也可以在其他基于 Debian 的系统上工作。如果您使用的是其他操作系统,也许下面列出的软件包名称会引导您走向正确的方向。

首先,您需要了解您的发行版中可用的 OpenJFX 版本。从命令行运行:

$ apt-cache policy openjfx

版本表部分,您可能会看到两个选项。我目前看到 11.0.2+1-1~18.04.28u161-b12-1ubuntu2 。以 11 开头的版本是默认版本,即使您(可能)安装了 openjdk-8-jdk。您需要以数字 8 开头的版本。在撰写本文时,这是8u161-b12-1ubuntu2

要安装 OpenJFX 和相关软件包(假设您正在从事开发工作),首先确保您已卸载任何基于 Java 11 的软件包,因为它们将(不)愉快地与 JDK 8 共存,并导致您很多问题。

$ sudo apt remove openjfx openjfx-source libopenjfx-java libopenjfx-jni

接下来,安装正确的版本(将policy 查询中列出的任何版本替换为8u161-b12-1ubuntu2):

$ sudo apt install openjfx=8u161-b12-1ubuntu2 openjfx-source=8u161-b12-1ubuntu2 libopenjfx-java=8u161-b12-1ubuntu2 libopenjfx-jni=8u161-b12-1ubuntu2

更新:第二天我注意到sudo apt upgrade(或自动系统更新)会“升级”我精心挑选的版本的 jfx 包。以下是防止这种情况发生的方法:

$ sudo apt-mark hold openjfx openjfx-source libopenjfx-java libopenjfx-jni
openjfx set on hold.
openjfx-source set on hold.
libopenjfx-java set on hold.
libopenjfx-jni set on hold.

您可以随时运行sudo apt showhold 来列出被阻止的包。

安装这些旧但很好的软件包为我解决了所有问题。我希望他们也能帮助你。

【讨论】:

啊!是的,这行得通。 openjfx11 是问题所在。这解决了它。【参考方案7】:

我找到了一个对我有用的解决方案,堆栈跟踪比这一行更重要:

Graphics Device initialization failed for :  es2, sw.

向上滚动,您会发现如下所示的一行:

Caused by: java.lang.RuntimeException: java.lang.UnsatisfiedLinkError: Can't load library: /usr/lib/jvm/java-8-openjdk-amd64/jre/lib/amd64/libglass.so

现在从 oracle 下载新的 jdk,将丢失的文件从那里复制到文件丢失的文件夹中。

我总共丢失了 3 个我复制的文件,这可能因人而异

希望这对你们中的一些人有所帮助

【讨论】:

【参考方案8】:

在我的例子中,问题是缺少 32 位对 64 位分发的依赖。

对我来说,以下命令修复了 Ubuntu 16.10 (x86-64) 上的问题:

sudo apt-get install libgtk2.0-0:i386 libxtst6:i386

相关问题:

Ubuntu 64 bit Machinarium: error while loading shared libraries: libgtk-x11-2.0.so.0 Can't find/install libXtst.so.6?

【讨论】:

【参考方案9】:

在全新的 Ubuntu 18.10 安装中,当在 pycharm(社区版)中呈现 markdown 文件的预览时,我遇到了同样的问题。

我下载了一个 oracle JRE (jre1.8.0_201) 并使用它代替了 pycharm 附带的 jre,但我又遇到了同样的问题。

然后添加了 -Dprism.verbose=true 选项,这表明缺少 libgtk-x11-2.0.so.0。最后 sudo apt-get install libgtk2.0-0 解决了这个问题。

谢谢, 保罗

【讨论】:

【参考方案10】:

对于使用 Eclipse 遇到此问题的任何人,可以在“调试选项”窗口中添加 -Dprism.verbose=true 到 JVM 参数来找到解决方案(就像其他回复中已经提到的那样)。之后,缺少的库将列在控制台中。

但是,我解决了从 Oracle 官方页面下载和安装 Java 的简单问题

https://www.java.com/it/download/

之后,您会在/usr/java/jre-1.8.X_XXX 下找到Java 文件夹(这取决于您下载的版本)。

然后,打开 Eclipse 并从 Window->Preferences->Java->Installed JREs 使用上述路径添加新的 JRE。

现在,在项目的构建路径上设置工作区的 JRE。

它现在应该可以工作了。

您还可以仅为特定项目设置 JRE,在我的情况下,作为常规设置更有用。

系统:Fedora 26 64 位。 (jre1.8.0_144)。

【讨论】:

【参考方案11】:

对于 ArchLinux 上的用户: pacman -Sy java-openjfx 没有安装必要的gtk2 包(GTK3 不算在内)。

【讨论】:

【参考方案12】:

-Dprism 选项帮助打印出文件列表:

无法打开共享对象文件:找不到文件或目录。

    libgtk-x11-2.0.so.0 libXxf86vm.so.1 libGL.so.1

安装软件包后它确实工作了。

【讨论】:

【参考方案13】:

假设您已正确设置 JavaFX,您只需在 VM Options 中添加以下行:

-p %path to javafx%/lib --add-modules javafx.controls,javafx.fxml

要在 IntelliJ 中编辑 VM 选项,您需要打开 运行/调试配置

(当然,将 %path 更改为 javafx%,使其指向您的 JavaFX 文件夹位置)

【讨论】:

我在 Eclipse 中添加了这些参数,但仍然是同样的错误。【参考方案14】:

我在Ubuntu 20.04 收到此错误消息。这对我有用。我去Zulu下载了jdk 11。我选择了java版本为11,Java包为JDK FX。安装.deb文件后,我在.zshrc上设置了$JAVA_HOME:

export JAVA_HOME=/usr/lib/jvm/zulu-fx-11-amd64
export PATH=$JAVA_HOME/bin:$PATH

这解决了我的问题。

【讨论】:

【参考方案15】:

我也遇到了这个问题。我的问题是我下载了我的 fx 全局库的 aaarch64 版本。您所要做的就是下载它的 x64 版本。再次尝试运行您的代码,它可能会起作用,它对我有用。 :)

下载 fx lib 文件的链接:https://gluonhq.com/products/javafx/

【讨论】:

如果这很混乱,我也可以写一个完整的逐步过程

以上是关于Linux 上的 JavaFX 显示“图形设备初始化失败:es2,sw”的主要内容,如果未能解决你的问题,请参考以下文章

Linux 上的 JavaFX

JavaFX 运行时 JAR 文件 jfxrt.jar 在 Linux 上的位置是啥?

如何在 Linux 上的 Intellij 中逐步正确安装 java 和 javafx? [复制]

javafx中菜单上的单击事件

如何在 JavaFX 的控制器文件中调用舞台上的函数

javafx中,用image()创建图片路径时,若是输入URL地址可以显示图片,若是输入文件路径则显示不出。