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.so
或 libglass.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.2
和 8u161-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”的主要内容,如果未能解决你的问题,请参考以下文章
JavaFX 运行时 JAR 文件 jfxrt.jar 在 Linux 上的位置是啥?