2017-01-13 1 views
1

Eclipse fonctionne correctement dans le conteneur et sa fenêtre est visible sur l'hôte (le X11 étant partagé via le socket).Erreur irrécupérable lors de l'exécution d'une application JavaFX GUI dans Eclipse dans un conteneur Docker

L'application est un projet Eclipse RCP utilisant JavaFX (Efxclipse et M2Eclipse). J'ai supprimé toutes les références pour le RCP ci-dessous pour avoir moins de complexité dans l'exemple et parce que cela arrive aussi avec des applications JavaFX très simples (non OSGI) - OSGI n'est donc pas l'émetteur.

L'erreur fatale suivante se produit lors de l'exécution d'une application JavaFX GUI dans Eclipse (à l'intérieur d'un conteneur 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 
# 

Le journal complet peut être trouvé here.

Détails de l'hôte:

  • Ubuntu 16.10
  • Docker la version 1.12.3, construire 6b644ec

détails Container:

  • Ubuntu 16.04
  • Oracle JDK 1.8.0_111 64bits
  • Eclipse Luna (RCP 4.4.2) avec e (fx) clipse 1.2.0.201501301049
  • Dockerfile

Code pour l'application 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); 
    } 
} 

Bien que j'ai réussi à exécuter une application GUI simple en utilisant 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(); 
      } 
     }); 
    } 
} 

et cela nous a conduit à un problème lié à JavaFX.

Même en exécutant une application JavaFX exportée (en tant que fichier Jar) sur la console (en dehors d'Eclipse), elle renvoie la même erreur.

Des idées sur comment le résoudre et avoir l'application JavaFX en cours d'exécution dans Eclipse dans le conteneur?

Merci

+0

Dup possible: http://stackoverflow.com/q/16296753/18157 - Pas duper-martelage parce que je ne connais pas assez Docker pour dire si elle répond à la question de l'OP. –

+0

Merci d'avoir commenté @JimGarrison mais ce n'est pas une copie/même cas. Eclipse fonctionne bien à l'intérieur du conteneur (partage du X via le socket). Le problème est seulement avec l'application JavaFX .. – wcomnisky

+0

Le crash Problématique frame: # C [ld-linux-x86-64.so.2 + 0x9d20] montre qu'il est plus de problème de la glibc, pointe vers le chemin exact et relance votre application – Fairoz

Répondre

0

Le problème était lié à quelques dépendances manquantes dans mon image Ubuntu. Sans eux, je ne pouvais pas exécuter les applications JavaFX dans un conteneur Docker.

Installation des packages suivants ont résolu le problème:

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

J'ai essayé d'installer un seul ou deux d'entre eux (une sorte de combinaison) pour tenter de trouver celle qui est nécessaire exactement, mais il est avéré prendre beaucoup de temps, donc je les installe tous - pour l'instant.

J'ai trouvé la solution sur ce Dockerfile lors de la recherche d'exemples sur Github.Merci Patrick Martin.