Linux 上的 JavaFX 显示“图形设备初始化失败:es2,sw”
- 2024-10-22 08:28:00
- admin 原创
- 87
问题描述:
我刚刚开始在 Linux 上编写/测试 JavaFX 内容,在启动一个简单的应用程序时遇到了错误。我在论坛上发现很多人对此表示担忧,但我找不到关于发生这种情况的原因的清晰解释。我想了解我的场景中缺少什么才能使其正常工作。
如有任何建议,我们将不胜感激。
环境信息:
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)
解决方案 1:
您应该查看此相关错误,以获取有关如何解决问题的帮助。总之,建议如下:
-Dprism.verbose=true
使用标志运行应用程序检查生成的详细日志
它可能指向缺少的图形库:在 Linux 上运行 JavaFX 需要 GTK 2.18
解决方案 2:
您需要安装 OpenJFX:
apt-get install openjfx
然后运行该程序。
解决方案 3:
我通过将 libswt-gtk-3-java 和 gkt3 添加到我的系统来解决这个问题。
解决方案 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 位置。这样就足够了。
解决方案 5:
我失败了,因为我没有 gtk 库。启用-Dprism.verbose=true
@assylias 提到的功能后
我可以找到并安装以下软件包。
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
随时运行来列出被保留的包裹。
安装这些虽然老旧但效果很好的软件包后,我的所有问题都解决了。希望它们也能帮到你。
解决方案 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:
就我而言,问题是 64 位发行版缺少 32 位依赖项。
对我来说,以下命令修复了 Ubuntu 16.10(x86-64)上的问题:
sudo apt-get install libgtk2.0-0:i386 libxtst6:i386
相关问题:
Ubuntu 64 位 Machinarium:加载共享库时出错:libgtk-x11-2.0.so.0
找不到/安装 libXtst.so.6?
解决方案 9:
对于 ArchLinux 用户:pacman -Sy java-openjfx
没有安装必要的gtk2
软件包(GTK3 不算)。
解决方案 10:
在全新安装的 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 解决了这个问题。
谢谢,保罗
解决方案 11:
对于在使用 Eclipse 时遇到此问题的人,解决方案是将-Dprism.verbose=true
JVM 参数添加到“调试选项”窗口(如其他回复中所述)。之后,缺少的库将列在控制台中。
不过,我通过从 Oracle 官方页面下载并安装 Java 解决了这个问题。
https://www.java.com/it/download/
此后,您将在下面找到 Java 文件夹/usr/java/jre-1.8.X_XXX
(取决于您下载的版本)。
然后,打开 Eclipse 并从 Window->Preferences->Java->Installed JREs 使用上面提到的路径添加一个新的 JRE。
现在,在项目的构建路径上设置工作区的 JRE。
现在它应该可以工作了。
您还可以仅为特定项目设置 JRE,就我而言,作为常规设置更有用。
系统:Fedora 26 64位。(jre1.8.0_144)。
解决方案 12:
然后 -Dprism 选项会打印出文件列表:
无法打开共享对象文件:未找到文件或目录。
libgtk-x11-2.0.so.0
libXxf86vm.so.1
库GL.so.1
安装软件包后它确实起作用了。
解决方案 13:
假设您已正确设置 JavaFX,您只需将以下行添加到VM 选项中:
-p %path to javafx%/lib --add-modules javafx.controls,javafx.fxml
要在 IntelliJ 中编辑 VM 选项,您需要打开运行/调试配置。
(当然,将%path 更改为 javafx%,以便它指向您的 JavaFX 文件夹位置)
解决方案 14:
我在 上收到此错误消息Ubuntu 20.04
。以下是对我有用的方法。我去 Zulu 下载了 jdk 11。我选择的 java 版本为 11,Java 包为JDK FX
。安装.deb
文件后,我在 上设置了 $JAVA_HOME .zshrc
:
export JAVA_HOME=/usr/lib/jvm/zulu-fx-11-amd64
export PATH=$JAVA_HOME/bin:$PATH
这解决了我的问题。
解决方案 15:
我也遇到了这个问题。对我来说,问题是我下载了 aaarch64 版本的 fx 全局库。您所要做的就是下载它的 x64 版本。尝试再次运行您的代码,它可能会起作用,对我来说确实如此。:)
下载 fx lib 文件的链接:https ://gluonhq.com/products/javafx/
解决方案 16:
JavaFX aarch64 版本是导致我的计算机出现此问题的原因。 切换到 x64 版本后问题得到解决。
解决方案 17:
我遇到了同样的错误,但这是使用一个简单的 FX 应用程序时出现的,我检查发现这种依赖关系是导致此错误的主要原因:
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-graphics</artifactId>
<version>17.0.1</version>
<classifier>linux</classifier>
</dependency>
一旦我评论过,并且还评论过,这个“需要javafx.graphics;”来自模块信息,应用程序就会按预期启动......
是的,这很奇怪,但这就是这里的运作方式
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理必备:盘点2024年13款好用的项目管理软件