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

Ver*_*ion 32 java linux javafx java-8

我刚开始在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
Run Code Online (Sandbox Code Playgroud)

例外:

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)
Run Code Online (Sandbox Code Playgroud)

ass*_*ias 21

您应该查看此相关错误,以获取有关如何解决问题的帮助.总之,建议如下:

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

  • 不知道为什么,但是-Dprism.verbose = true没有在错误消息上添加任何其他信息。无论如何,图形库肯定是我遇到的问题(当前的GTK 2.16)。我将尝试对其进行更新并使其正常运行。感谢亚述! (2认同)
  • @HARSHITASETHI,您可以使用java -jar blabla.jar运行您的应用程序,只需添加-Dprism.verbose = true即可。如果从IDE运行它,则需要将其添加到JVM参数中。 (2认同)

小智 15

您需要安装OpenJFX:

apt-get install openjfx
Run Code Online (Sandbox Code Playgroud)

然后运行该程序.

  • 经过以上所有尝试,这确实是解决方案。谢谢! (2认同)
  • @FearX 这个答案已经过时了,这里的大多数答案也是如此。列出的命令将安装 _latest_ openjfx,它与 Java 8 不兼容。我将发布一个应该可以解决问题的答案...如果您使用的是 Ubuntu(否则您可以使用 Oracle JDK 8,如果它兼容)与你的哲学等)你需要特别请求 Java 8 版本。 (2认同)

小智 8

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

  • 你在linux上安装gtk3时发出了什么命令? (6认同)
  • 如果您在无头模式下运行,您还需要 xvfb (2认同)

Ler*_*ich 6

问题可能在您的旧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
Run Code Online (Sandbox Code Playgroud)

输出应该是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`. (5认同)
  • **注意**但是,**安装它**(在 Fedora 29 上仅名为“openjfx”)**是不够的**(至少在 Fedora 29 上)。阅读发行版特定的自述文件,并考虑到序言部分以包含“something”的行结尾,并且最后没有任何额外内容,您可以使用“sed 1,/something/d /usr/share/doc/openjfx/README”进行安装.fedora | 嘘`。 (2认同)

Pra*_* M 6

它对我来说失败了,因为我没有 gtk 库。-Dprism.verbose=true如@assylias所述启用后

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

sudo apt-get install libgtk2.0-bin libXtst6 libxslt1.1
Run Code Online (Sandbox Code Playgroud)

它解决了问题


Lam*_*art 5

如果您像原来的提问者一样使用 Java 8,则需要安装 Oracle JDK 8(祝您好运),或者安装 OpenJFX 8 以与 OpenJDK 8 一起使用。

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

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

$ apt-cache policy openjfx
Run Code Online (Sandbox Code Playgroud)

版本表部分,您可能会看到两个选择。我目前看到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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

更新:我注意到第二天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.
Run Code Online (Sandbox Code Playgroud)

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

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