java.awt.AWTError: Невозможно подключиться к серверу окон X11, используя ': 0' в качестве значения переменной DISPLAY - PullRequest
2 голосов
/ 18 марта 2019

Я пытался запустить приложение Java AWT на виртуальной машине Ubuntu внутри Docker . Приложение очень простое и безупречно работает в Windows через Eclipse. Он просто открывает окно и печатает привет мир !. Фактически, когда я экспортирую файл jar в виртуальную машину Ubuntu, которая работает на моем хосте Windows, при выводе файла jar через «java -jar JFrameDocker.jar» выдается тот же вывод, что и в Windows.

Однако история не та, когда я пытаюсь запустить ее в докере. Инструкции, которые я указал в Dockerfile, выполняются без ошибок, но когда я запускаю приложение, оно выдает «java.awt.AWTError: Невозможно подключиться к серверу окон X11, используя«: 0 »в качестве значения переменной DISPLAY» . Поверьте мне, ребята, я много раз пытался решить эту проблему, но пока не повезло. Как и установка значения переменной DISPLAY несколько раз, запуск X-сервера с использованием xterm и xeyes, просмотр каждой возможной статьи, которую я нашел в Интернете. Но, похоже, здесь ничего не работает. Я предоставляю здесь все свои файлы, которые помогут вам лучше понять мою проблему. Кстати, этот не отвечает на мой вопрос, поскольку такая же ошибка выдается даже после внесения изменений.

Это мой файл Java.

package com.etp;
import java.awt.FlowLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class JFrameDockerTest {

    public static void main(String[] args) {
        JFrame frame = new JFrame();
        JPanel panel = new JPanel();
        JLabel lable = new JLabel("Hello World");
        panel.setLayout( new FlowLayout() );  
        frame.add(panel);
        panel.add(lable);
        frame.setVisible(true);
        frame.setSize(800, 600);
    }

}

Это мой Dockerfile:

FROM java:8
ENV DISPLAY :0
ADD JFrameDocker.jar JFrameDocker.jar
CMD ["java","-jar", "JFrameDocker.jar"]

Я использовал приведенные ниже команды docker для создания образа и его запуска.

Docker Build: sudo docker build -t jframedocker .

Docker Run: sudo docker run jframedocker

Снимок экрана: вывод без ошибки: (без докера)

Выход с докером:

etp@etp-VirtualBox:~/Downloads/JFrameDocker$ sudo docker run jframedocker
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:498)
    at org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader.main(JarRsrcLoader.java:58)
Caused by: java.awt.AWTError: Can't connect to X11 window server using ':0' as the value of the DISPLAY variable.
    at sun.awt.X11GraphicsEnvironment.initDisplay(Native Method)
    at sun.awt.X11GraphicsEnvironment.access$200(X11GraphicsEnvironment.java:65)
    at sun.awt.X11GraphicsEnvironment$1.run(X11GraphicsEnvironment.java:115)
    at java.security.AccessController.doPrivileged(Native Method)
    at sun.awt.X11GraphicsEnvironment.<clinit>(X11GraphicsEnvironment.java:74)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:264)
    at java.awt.GraphicsEnvironment.createGE(GraphicsEnvironment.java:103)
    at java.awt.GraphicsEnvironment.getLocalGraphicsEnvironment(GraphicsEnvironment.java:82)
    at java.awt.Window.initGC(Window.java:475)
    at java.awt.Window.init(Window.java:495)
    at java.awt.Window.<init>(Window.java:537)
    at java.awt.Frame.<init>(Frame.java:420)
    at java.awt.Frame.<init>(Frame.java:385)
    at javax.swing.JFrame.<init>(JFrame.java:189)
    at com.etp.JFrameDockerTest.main(JFrameDockerTest.java:12)
    ... 5 more

1 Ответ

0 голосов
/ 18 марта 2019

Вы используете java:8 базовое изображение, которое, скорее всего, не предоставляет графическое окружение.

Вы можете использовать ubuntu:18.04 базовый образ с установленными вручную пакетами openjdk-11-jdk и xvfb.Команда xvfb-run позаботится о настройке виртуальной среды X-сервера:

xvfb-run устанавливает файл полномочий X (или используетсуществующий, указанный пользователем), записывает в него куки (см. xauth (1x)) и затем запускает X-сервер Xvfb в качестве фонового процесса.Идентификатор процесса Xvfb сохраняется для последующего использования.Затем указанная команда запускается с использованием дисплея X, соответствующего только что запущенному серверу Xvfb и ранее созданному файлу полномочий X.

Dockerfile

FROM ubuntu:18.04
RUN apt-get update -y && apt-get upgrade -y && apt-get install -y openjdk-11-jdk xvfb 
ADD JFrameDocker.java MANIFEST.mf ./
RUN javac JFrameDocker.java
RUN jar cfm JFrameDocker.jar MANIFEST.mf JFrameDocker.class 
RUN xvfb-run java -jar JFrameDocker.jar

JFrameDocker.java

import java.awt.FlowLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class JFrameDocker {

    public static void main(String[] args) {
        JFrame frame = new JFrame();
        JPanel panel = new JPanel();
        JLabel lable = new JLabel("Hello World");
        panel.setLayout(new FlowLayout());  
        frame.add(panel);
        panel.add(lable);
        frame.setSize(800, 600);
        frame.setVisible(true);
        System.out.println("Up and running");
    }

}

MANIFEST.mf

Manifest-Version: 1.0
Main-Class: JFrameDocker
...