2017-01-13 33 views
1

Eclipse отлично работает внутри контейнера, и его окно видно на хосте (при этом X11 используется совместно с сокетом).Неустранимая ошибка при запуске приложения GUI JavaFX внутри Eclipse в контейнере Docker

Приложение представляет собой проект RCP Eclipse с использованием JavaFX (Efxclipse и M2Eclipse). Я удалил все ссылки для RCP ниже, чтобы иметь меньшую сложность в примере и потому, что это происходит с действительно простыми приложениями JavaFX (кроме OSGI), поэтому OSGI не является эмитентом.

Произошла следующая фатальная ошибка при запуске приложения GUF для JavaFX внутри Eclipse (внутри контейнера 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 JDK 1.8.0_111 64бит
  • Eclipse, Luna (RCP 4.4.2) с электронной (Fx) Clipse 1.2.0.201501301049
  • 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:

 
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.

Даже запустив экспортированное приложение JavaFX (как файл Jar) на консоли (вне Eclipse), он возвращает ту же ошибку.

Идеи о том, как его решить и иметь приложение JavaFX, работающее внутри Eclipse в контейнере?

Благодаря

+0

Возможный дубликат: http://stackoverflow.com/q/16296753/18157 - Не дублировать, потому что я не знаю Докера достаточно, чтобы сказать, отвечает ли он на вопрос OP. –

+0

Благодарим за комментарий @JimGarrison, но это не дублируется/тот же случай. Eclipse хорошо работает внутри контейнера (разделяя X-сокет). Проблема заключается только в приложении JavaFX. – wcomnisky

+0

Аварийный аварийный кадр: # C [ld-linux-x86-64.so.2 + 0x9d20] показывает, что это больше проблема glibc, указывает на точный путь и повторно запускают ваше приложение – Fairoz

ответ

0

Проблема была связана с несколькими отсутствующими зависимостей в моей Ubuntu образ. Без них я не мог запускать приложения JavaFX в контейнере Docker.

Установка следующих пакетов решена проблема:

 
gtk2-engines 
libswt-gtk-3-java 
libxslt1.1 
libxtst6 
libxxf86vm1 

Я попытался установить только один или два из них (своего рода комбинации) в попытке выяснить, какой из них точно нужен, но оказалось, чтобы тратить много времени, поэтому я устанавливаю их все - пока.

Я нашел решение на этом Dockerfile при поиске примеров на Github.Спасибо Patrick Martin.