在 Docker 容器中的 Eclipse 中 运行 JavaFX GUI 应用程序时出现致命错误
Fatal error when running a JavaFX GUI app inside Eclipse in a Docker container
Eclipse 在容器内运行良好,其 window 在主机上可见(X11 通过套接字共享)。
该应用程序是一个使用 JavaFX(Efxclipse 和 M2Eclipse)的 Eclipse RCP 项目。我删除了下面 RCP 的所有引用以降低示例中的复杂性,因为它也发生在非常简单的 JavaFX 应用程序(非 OSGI)中 - 所以 OSGI 不是发布者。
当 运行 Eclipse 中的 JavaFX GUI 应用程序(在 Docker 容器中)时,会发生以下致命错误。
#
# A fatal error has been detected by the Java Runtime Environment:
#
# SIGSEGV (0xb) at pc=0x00007f56bb14dd20, pid=233, tid=0x00007f567cea1700
#
# JRE version: Java(TM) SE Runtime Environment (8.0_111-b14) (build 1.8.0_111-b14)
# Java VM: Java HotSpot(TM) 64-Bit Server VM (25.111-b14 mixed mode linux-amd64 compressed oops)
# Problematic frame:
# C [ld-linux-x86-64.so.2+0x9d20]
#
# Core dump written. Default location: /home/docker/test/JavaFX/login/core or core.233
#
# An error report file with more information is saved as:
# /home/docker/test/JavaFX/login/hs_err_pid233.log
#
# If you would like to submit a bug report, please visit:
# http://bugreport.java.com/bugreport/crash.jsp
#
可以找到完整的日志 here。
主机详细信息:
- Ubuntu 16.10
- Docker 版本 1.12.3,构建 6b644ec
容器详细信息:
- Ubuntu 16.04
- Oracle JDK1.8.0_11164 位
- 带有 e(fx)clipse 1.2.0.201501301049 的 Eclipse Luna (RCP 4.4.2)
- Dockerfile
JavaFX 应用代码:
package application;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.layout.BorderPane;
import javafx.stage.Stage;
public class Main extends Application {
@Override
public void start(Stage primaryStage) {
try {
Scene scene = new Scene(new BorderPane(),400,400);
primaryStage.setScene(scene);
primaryStage.show();
} catch(Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
launch(args);
}
}
尽管我取得了成功 运行 使用 Swing 的简单 GUI 应用程序:
package application;
import javax.swing.JFrame;
import javax.swing.JLabel;
public class Test {
private static void createAndShowGUI() {
JFrame frame = new JFrame("Test");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(500, 500);
JLabel label = new JLabel("Test");
frame.getContentPane().add(label);
frame.setVisible(true);
}
public static void main(String[] args) {
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI();
}
});
}
}
这导致我们遇到一些与 JavaFX 相关的问题。
即使 运行 在控制台(Eclipse 外部)上导出的 JavaFX 应用程序(作为 Jar 文件)也返回相同的错误。
关于如何解决它并在容器中的 Eclipse 中安装 JavaFX 应用程序 运行 的想法?
谢谢
这个问题与我的 Ubuntu 图像中缺少的一些依赖项有关。没有它们,我无法在 Docker 容器中 运行 JavaFX 应用程序。
安装以下软件包解决了问题:
gtk2-engines
libswt-gtk-3-java
libxslt1.1
libxtst6
libxxf86vm1
我试图只安装其中的一个或两个(一种组合)以试图找出究竟需要哪个,但事实证明这很耗时所以我安装了所有的 - 因为现在。
我在这个 Dockerfile when searching for examples on Github. Thanks Patrick Martin 上找到了解决方案。
Eclipse 在容器内运行良好,其 window 在主机上可见(X11 通过套接字共享)。
该应用程序是一个使用 JavaFX(Efxclipse 和 M2Eclipse)的 Eclipse RCP 项目。我删除了下面 RCP 的所有引用以降低示例中的复杂性,因为它也发生在非常简单的 JavaFX 应用程序(非 OSGI)中 - 所以 OSGI 不是发布者。
当 运行 Eclipse 中的 JavaFX GUI 应用程序(在 Docker 容器中)时,会发生以下致命错误。
#
# A fatal error has been detected by the Java Runtime Environment:
#
# SIGSEGV (0xb) at pc=0x00007f56bb14dd20, pid=233, tid=0x00007f567cea1700
#
# JRE version: Java(TM) SE Runtime Environment (8.0_111-b14) (build 1.8.0_111-b14)
# Java VM: Java HotSpot(TM) 64-Bit Server VM (25.111-b14 mixed mode linux-amd64 compressed oops)
# Problematic frame:
# C [ld-linux-x86-64.so.2+0x9d20]
#
# Core dump written. Default location: /home/docker/test/JavaFX/login/core or core.233
#
# An error report file with more information is saved as:
# /home/docker/test/JavaFX/login/hs_err_pid233.log
#
# If you would like to submit a bug report, please visit:
# http://bugreport.java.com/bugreport/crash.jsp
#
可以找到完整的日志 here。
主机详细信息:
- Ubuntu 16.10
- Docker 版本 1.12.3,构建 6b644ec
容器详细信息:
- Ubuntu 16.04
- Oracle JDK1.8.0_11164 位
- 带有 e(fx)clipse 1.2.0.201501301049 的 Eclipse Luna (RCP 4.4.2)
- Dockerfile
JavaFX 应用代码:
package application;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.layout.BorderPane;
import javafx.stage.Stage;
public class Main extends Application {
@Override
public void start(Stage primaryStage) {
try {
Scene scene = new Scene(new BorderPane(),400,400);
primaryStage.setScene(scene);
primaryStage.show();
} catch(Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
launch(args);
}
}
尽管我取得了成功 运行 使用 Swing 的简单 GUI 应用程序:
package application; import javax.swing.JFrame; import javax.swing.JLabel; public class Test { private static void createAndShowGUI() { JFrame frame = new JFrame("Test"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setSize(500, 500); JLabel label = new JLabel("Test"); frame.getContentPane().add(label); frame.setVisible(true); } public static void main(String[] args) { javax.swing.SwingUtilities.invokeLater(new Runnable() { public void run() { createAndShowGUI(); } }); } }
这导致我们遇到一些与 JavaFX 相关的问题。
即使 运行 在控制台(Eclipse 外部)上导出的 JavaFX 应用程序(作为 Jar 文件)也返回相同的错误。
关于如何解决它并在容器中的 Eclipse 中安装 JavaFX 应用程序 运行 的想法?
谢谢
这个问题与我的 Ubuntu 图像中缺少的一些依赖项有关。没有它们,我无法在 Docker 容器中 运行 JavaFX 应用程序。
安装以下软件包解决了问题:
gtk2-engines libswt-gtk-3-java libxslt1.1 libxtst6 libxxf86vm1
我试图只安装其中的一个或两个(一种组合)以试图找出究竟需要哪个,但事实证明这很耗时所以我安装了所有的 - 因为现在。
我在这个 Dockerfile when searching for examples on Github. Thanks Patrick Martin 上找到了解决方案。