Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java.awt.AWTError:Can';t使用';连接到X11窗口服务器:0';作为显示变量的值_Java_Docker_Dockerfile_X11 Forwarding - Fatal编程技术网

java.awt.AWTError:Can';t使用';连接到X11窗口服务器:0';作为显示变量的值

java.awt.AWTError:Can';t使用';连接到X11窗口服务器:0';作为显示变量的值,java,docker,dockerfile,x11-forwarding,Java,Docker,Dockerfile,X11 Forwarding,我一直在尝试在Docker内部的Ubuntu VM上运行基于Java AWT的应用程序。该应用程序非常简单,通过Eclipse在Windows上完美地运行。它只需打开一个窗口并打印hello world!。事实上,当我将jar文件导出到运行在Windows主机上的Ubuntu虚拟机中时,通过“java-jar JFrameDocker.jar”运行jar文件时,也会得到与Windows相同的输出 然而,当我试图在docker内部运行它时,情况就不一样了。我在Dockerfile中指定的指令执行时

我一直在尝试在Docker内部的Ubuntu VM上运行基于Java AWT的应用程序。该应用程序非常简单,通过Eclipse在Windows上完美地运行。它只需打开一个窗口并打印hello world!。事实上,当我将jar文件导出到运行在Windows主机上的Ubuntu虚拟机中时,通过“java-jar JFrameDocker.jar”运行jar文件时,也会得到与Windows相同的输出

然而,当我试图在docker内部运行它时,情况就不一样了。我在Dockerfile中指定的指令执行时没有任何错误,但当我运行应用程序时,它会抛出错误 “java.awt.awt错误:无法使用:0”作为显示变量“的值连接到X11窗口服务器。相信我,伙计们,我已经尝试了很多次来解决这个问题,但直到现在都没有运气。 比如多次设置DISPLAY变量值,使用xterm和xeyes启动X服务器,浏览我在Web上找到的所有可能的文章。但这里似乎什么都不管用。我在这里提供我的所有文件,可以让你更好地了解我的问题。 顺便说一句,这并没有回答我的问题,因为即使在做了更改之后也会抛出相同的错误

这是我的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"]
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
我使用了下面的docker命令来构建图像并运行它

Docker Build:
sudo Docker Build-t jframedocker.

Docker运行:
sudo Docker运行jframedocker

与Docker一起输出:

FROM java:8
ENV DISPLAY :0
ADD JFrameDocker.jar JFrameDocker.jar
CMD ["java","-jar", "JFrameDocker.jar"]
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
etp@etp-VirtualBox:~/Downloads/JFrameDocker$sudo docker运行JFrameDocker
线程“main”java.lang.reflect.InvocationTargetException中出现异常
在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处
位于sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)中
位于java.lang.reflect.Method.invoke(Method.java:498)
位于org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader.main(JarRsrcLoader.java:58)
原因:java.awt.awt错误:无法使用“:0”作为显示变量的值连接到X11窗口服务器。
位于sun.awt.X11GraphicsEnvironment.initDisplay(本机方法)
位于sun.awt.X11GraphicsEnvironment.access$200(X11GraphicsEnvironment.java:65)
位于sun.awt.X11GraphicsEnvironment$1.run(X11GraphicsEnvironment.java:115)
位于java.security.AccessController.doPrivileged(本机方法)
位于sun.awt.X11GraphicsEnvironment。(X11GraphicsEnvironment.java:74)
位于java.lang.Class.forName0(本机方法)
位于java.lang.Class.forName(Class.java:264)
位于java.awt.GraphicsEnvironment.createGE(GraphicsEnvironment.java:103)
位于java.awt.GraphicsEnvironment.getLocalGraphicsEnvironment(GraphicsEnvironment.java:82)
位于java.awt.Window.initGC(Window.java:475)
位于java.awt.Window.init(Window.java:495)
在java.awt.Window.(Window.java:537)
在java.awt.Frame.(Frame.java:420)
在java.awt.Frame.(Frame.java:385)
在javax.swing.JFrame。(JFrame.java:189)
位于com.etp.JFrameDockerTest.main(JFrameDockerTest.java:12)
... 还有5个

您使用的是
java:8
基本映像,它很可能不提供图形环境

您可以在手动安装的
openjdk-11-jdk
xvfb
软件包中使用
ubuntu:18.04
基本映像。该命令将负责设置虚拟X服务器环境:

xvfb run设置X权限文件(或使用现有用户指定的文件),向其中写入cookie(请参阅xauth(1x)),然后作为后台进程启动xvfb X服务器。存储Xvfb的进程ID以供以后使用。然后使用与刚刚启动的Xvfb服务器和先前创建的X权限文件相对应的X显示来运行指定的命令

Dockerfile

来自ubuntu:18.04的

运行apt get update-y&&apt get update-y&&apt get install-y openjdk-11-jdk xvfb
添加JFrameDocker.java MANIFEST.mf/
运行javacjframedocker.java
运行jar cfm JFrameDocker.jar MANIFEST.mf JFrameDocker.class
运行xvfb运行java-jarjframedocker.jar
JFrameDocker.java

导入java.awt.FlowLayout;
导入javax.swing.JFrame;
导入javax.swing.JLabel;
导入javax.swing.JPanel;
公共类JFrameDocker{
公共静态void main(字符串[]args){
JFrame=新JFrame();
JPanel面板=新的JPanel();
JLabel标签=新的JLabel(“Hello World”);
panel.setLayout(新的FlowLayout());
框架。添加(面板);
面板。添加(标签);
框架设置尺寸(800600);
frame.setVisible(true);
System.out.println(“启动并运行”);
}
}
MANIFEST.mf

Manifest-Version: 1.0
Main-Class: JFrameDocker

在上面的URL中讨论了类似事情的可能重复。我试过用那个,但无法解决问题。这让我用一个简单的例子来回答这个问题。我尝试了你的建议,但这导致了以下错误docker:守护进程的错误响应:OCI运行时创建失败:container\u linux。go:344:启动容器进程导致“exec:\“java\”:在$PATH中找不到可执行文件:@unknown@SoumyaranjanPani,因为它正在容器中运行,而不是在主机系统中。您必须配置X转发才能看到容器屏幕。好的。我理解。您能否指导我如何配置X转发,以便我可以在容器屏幕中看到输出。事实上,我在ssh_config和sshd_config文件中配置了X11转发,但即使没有打印语句System.out.println(“启动并运行”),也无法看到输出;在ssh_config中有三个关于X11转发的参数,我将其值设置如下