【问题标题】:Java Can't connect to X11 window server using 'localhost:10.0' as the value of the DISPLAY variableJava 无法使用 'localhost:10.0' 作为 DISPLAY 变量的值连接到 X11 窗口服务器
【发布时间】:2021-08-02 15:11:51
【问题描述】:

我有一个脚本使用 java 连接到在 localhost 的端口 10.0 中显示 X11

但我总是得到这个错误

java.lang.InternalError: Can't connect to X11 window server using 'localhost:10.0' as the value of the DISPLAY variable.
    at sun.awt.X11GraphicsEnvironment.initDisplay(Native Method)
    at sun.awt.X11GraphicsEnvironment.access$200(X11GraphicsEnvironment.java:62)
    at sun.awt.X11GraphicsEnvironment$1.run(X11GraphicsEnvironment.java:178)
    at java.security.AccessController.doPrivileged(Native Method)
    at sun.awt.X11GraphicsEnvironment.<clinit>(X11GraphicsEnvironment.java:142)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:186)
    at java.awt.GraphicsEnvironment.getLocalGraphicsEnvironment(GraphicsEnvironment.java:82)
    at sun.awt.X11.XToolkit.<clinit>(XToolkit.java:112)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:186)
    at java.awt.Toolkit$2.run(Toolkit.java:849)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.awt.Toolkit.getDefaultToolkit(Toolkit.java:841)
    at ij.io.Opener.openJpegOrGif(Opener.java:367)
    at ij.io.Opener.openImage(Opener.java:220)
    at ij.io.Opener.openImage(Opener.java:249)
    at ij.io.Opener.open(Opener.java:116)
    at ij.IJ.open(IJ.java:1112)
    at ij.macro.Functions.open(Functions.java:2006)
    at ij.macro.Functions.doFunction(Functions.java:129)
    at ij.macro.Interpreter.doStatement(Interpreter.java:205)
    at ij.macro.Interpreter.doBlock(Interpreter.java:515)
    at ij.macro.Interpreter.runUserFunction(Interpreter.java:278)
    at ij.macro.Interpreter.getFactor(Interpreter.java:1200)
    at ij.macro.Interpreter.getTerm(Interpreter.java:1162)
    at ij.macro.Interpreter.getExpression(Interpreter.java:1145)
    at ij.macro.Interpreter.getBooleanExpression(Interpreter.java:881)
    at ij.macro.Interpreter.getLogicalExpression(Interpreter.java:857)
    at ij.macro.Interpreter.getBoolean(Interpreter.java:850)
    at ij.macro.Interpreter.doIf(Interpreter.java:829)
    at ij.macro.Interpreter.doStatement(Interpreter.java:217)
    at ij.macro.Interpreter.doBlock(Interpreter.java:515)
    at ij.macro.Interpreter.doStatement(Interpreter.java:241)
    at ij.macro.Interpreter.doIf(Interpreter.java:831)
    at ij.macro.Interpreter.doStatement(Interpreter.java:217)
    at ij.macro.Interpreter.doStatements(Interpreter.java:195)
    at ij.macro.Interpreter.run(Interpreter.java:99)
    at ij.macro.Interpreter.run(Interpreter.java:65)
    at ij.macro.Interpreter.run(Interpreter.java:75)
    at ij.plugin.Macro_Runner.runMacro(Macro_Runner.java:127)
    at ij.plugin.Macro_Runner.runMacroFile(Macro_Runner.java:112)
    at ij.IJ.runMacroFile(IJ.java:103)
    at ij.ImageJ.main(ImageJ.java:517)

我已经尝试了一切来解决这个问题,例如:

export DISPLAY=:10.0
export DISPLAY=localhost:10.0

我也尝试了端口 0.0,但总是遇到同样的错误

尝试xhost之后

xhost +local:all
xhost:  unable to open display ""
xhost:  unable to open display ":10.0"

我该如何解决这个问题 我认为 X 服务器没有运行所以我尝试了startx 它说它在那个端口运行

我的系统是Ubuntu server edition 10.04

【问题讨论】:

  • 如果还通过ssh使用VNC查看器:修改xhost访问列表后,需要重新打开SSH连接。至少在我当前的设置(VNC 到 Debian)中,我推断它需要获取更新的 xhost 访问列表。

标签: java linux x11 xserver


【解决方案1】:

需要在启动时指定-Djava.awt.headless=true参数。

【讨论】:

  • 非常感谢,但我必须在哪里准确指定?
  • 线程“主”java.awt.He adlessException 在 java.awt.GraphicsEnvironment.checkHeadless(GraphicsEnvironment.java:1 73) 中出现异常
  • 您在运行安全管理器吗?如果是这样,您可能必须授予权限。
  • 感谢问题是 X 服务器正在另一个端口上运行
  • 提问者的程序想做ij.io.Opener.openJpegOrGif,我们可以猜到可能需要一个GUI。所以 headless 会导致另一个错误:java.awt.HeadlessException.
【解决方案2】:

移除 DISPLAY 变量

unset DISPLAY

这在大多数情况下都有帮助(例如,启动应用程序服务器或其他基于 Java 的工具)并避免修改所有那么多命令行。

将其添加到 .bash_profile 以供专用的应用服务器/工具用户使用也很方便。

【讨论】:

  • 它根本没有帮助我。我得到了这个:AWT Can't connect to X11 window server using...
  • 如果您的应用使用 awt,那么您必须正确设置 DISPLAY。这适用于不使用 awt 的应用。
  • 在玩这个的时候,确保在你的 bashfile 中添加 unset 命令后重新启动 mobaXterm。由于 Display 变量将从之前设置并且仅运行您的 bash 文件不会改变它。
【解决方案3】:

这个命令帮我解决了这个问题:

export DISPLAY=:0

【讨论】:

  • unset DISPLAY 帮助了我(export DISPLAY=:0 我得到了错误Can't connect to X11 window server using ':0'
  • 你把它放在哪里了
  • 有时候——它不能在 linux 上工作,然后用 apt 安装 Xvfb 并在任何屏幕上运行它是件好事: Xvfb :1 然后在构建阶段设置变量 -- export DISPLAY=: 1 --> 这非常有效。
  • 这种行为有什么原因吗?
【解决方案4】:

我认为您正在使用 sudo 模式。请检查到用户模式并重试

【讨论】:

  • 这也是我的问题。不能以 root 身份运行似乎很奇怪,对吧?
  • 为什么我不能使用 sudo ?
  • @javajavajava 是的
  • 为我工作.. 认为 X11 服务器只能由当前会话的所有者在我的情况下启动
【解决方案5】:

如果有人试图通过 CI(jenkins,..) 上的 maven-surefire-plugin 运行自动化单元测试,并遇到上述错误,请务必更新您的 surefire 插件配置:

<plugin>
     <groupId>org.apache.maven.plugins</groupId>
     <artifactId>maven-surefire-plugin</artifactId>
     <version>${maven-surefire-plugin.version}</version>
     <configuration>
            <systemPropertyVariables>
                <java.awt.headless>true</java.awt.headless>
            </systemPropertyVariables>
      </configuration>
</plugin>

【讨论】:

  • 如何在 gradle 中进行操作以及如何在其中设置属性值。
【解决方案6】:

这将解决它:

/usr/bin/java -Djava.awt.headless=true $Your_program

【讨论】:

  • 没有修复我的
  • 这对我有用。谢谢你。我收到错误是因为我正在使用 poi。
【解决方案7】:

对我来说,使用 -Y 而不是 -X 登录有效。

如果您有如下所示的不受信任的 X11,请尝试使用 -Y 标志(如果您信任主机):

警告:不受信任的 X11 转发设置失败:未生成 xauth 密钥数据

【讨论】:

    【解决方案8】:

    如果您尝试使用 su 导出显示,但它仍然无法正常工作。 这对我有用。为 sudo 用户尝试 X11 转发。

    使用带有 ssh 的 -X 选项连接远程主机。

    # ssh -X root@remote-host
    

    现在列出当前用户的 cookie 集。

    # xauth list $DISPLAY
        node01.thegeekdiary.com/unix:10  MIT-MAGIC-COOKIE-1  dacbc5765ec54a1d7115a172147866aa
    # echo $DSIPLAY
        localhost:10.0
    

    使用 sudo 切换到另一个用户帐户。将上面命令输出中的 cookie 添加到 sudo 用户。

    # sudo su - [user]
    # xauth add node01.thegeekdiary.com/unix:10  MIT-MAGIC-COOKIE-1  dacbc5765ec54a1d7115a172147866aa
    

    再次为 sudo 用户导出步骤 2 中的显示。尝试使用命令 xclock 来验证 x 客户端应用程序是否按预期工作。

    # export DISPLAY=localhost:10.0
    

    来源:https://www.thegeekdiary.com/how-to-set-x11-forwarding-export-remote-display-for-users-who-switch-accounts-using-sudo/

    【讨论】:

      【解决方案9】:

      在使用无头 Fedora 22 在 raspberry pi 2 上安装 glassfish 的几天徒劳后,下面对我来说很顺利

       unset DISPLAY
      java -Djava.awt.headless=true -jar glassfissh-installer-v2ur2-b04-linux.jar
      

      here得到我的帮助

      【讨论】:

        【解决方案10】:

        首先:启动XQuartz

        二:ssh -X user@ip_address

        ...:开始你的进程

        如果你 ssh 然后启动 XQuartz 你会得到那个错误

        【讨论】:

          【解决方案11】:

          这解决了我的问题

          xhost +
          

          但请注意,xhost + 完全停用身份验证并允许每个人访问您屏幕上的所有应用程序。

          xhost +si:localuser:root 似乎与正确的身份验证类似。

          【讨论】:

            【解决方案12】:

            我在使用 Xming 时遇到了类似的错误。已采取以下步骤解决此问题:

            1. 在 Xming 启动中勾选无访问控制框。
            2. 在腻子中运行以下命令:DISPLAY=XXX.XXX.XXX.XX:0.0; export DISPLAY

            XXX.XXX.XXX.XX 替换为您的 IP 地址。

            【讨论】:

            • 我的配置相同,但它不起作用。我需要在 X0.hosts 文件中添加执行 X11 的 IP
            【解决方案13】:

            如果使用或在 /etc/profile 中设置,请首先在 Jenkins 的构建阶段执行此操作:

            unset DISPLAY
            export DISPLAY=:0
            

            然后在 java 代码或使用 maven 中设置此属性: -Djava.awt.headless=false

            【讨论】:

              【解决方案14】:

              解决了。我只是注销并使用 xorg 登录!

              【讨论】:

              • export DISPLAY=:0 或 export DISPLAY=:1 对我不起作用。注销并登录为我解决了这个问题。
              【解决方案15】:

              Michael-O 给出了解决问题的有用方法。解决此问题的另一种方法是使用 Putty 控制台启动服务器。

              【讨论】:

              • 你能解释一下它是如何工作的吗? (我没用过腻子)
              【解决方案16】:

              在我的情况下,我的机器中没有剩余空间,我遇到了同样的问题。 有时可能是空间问题。检查您的 Linux/Unix 环境中的空间,并确保您的机器有足够的空间。

              【讨论】:

                【解决方案17】:

                检查是否设置了 $DISPLAY 变量,使用以下命令:

                回显 $DISPLAY

                如果未设置显示变量,请运行以下命令进行设置,(即使已设置,您的会话也可以有以下一个)

                导出显示=:0.0

                在 putty 中也有 x 显示位置为 :0.0

                【讨论】:

                  【解决方案18】:

                  我在使用的 Linux 服务器上遇到了同样的问题。将 java 连接到 X11 显示器在头节点上有效,但在任何其他节点上无效。联系管理员后,原来我们的排班系统(SLURM)当前版本不支持X11转发。他们必须更新 SLURM(新版本的 SLURM 支持它)才能正常工作。

                  【讨论】:

                    【解决方案19】:

                    我让它工作的唯一方法是使用模板运行脚本。例如sudo ./glassfish-3.1.2.2-unix.sh -s 模板

                    这会在静默模式下安装 Glassfish。 http://docs.oracle.com/cd/E18930_01/html/821-2427/ghmva.html

                    【讨论】:

                      【解决方案20】:

                      我在远程运行 jconsole 命令时遇到了同样的错误。我想修改在远程 Linux 主机上运行的 jconsole 参数,我可以使用 SecureCRT 登录主机,终端抛出此错误信息。幸运的是,使用腻子时,没问题。奇怪....

                      【讨论】:

                        【解决方案21】:

                        如果您在 Hudson 中看到此错误,请尝试从您的主目录中删除 .java 目录,它可能对您有用。

                        【讨论】:

                          【解决方案22】:

                          如果您在通过 ssh 登录时在远程服务器上启动应用程序,那么另一种方法是使用 -x 参数启动 ssh 或在您的 /etc/ssh/ssh_config 中添加 ForwardX11 no。在这种情况下,ssh 不会创建环境变量 DISPLAY。

                          【讨论】:

                            【解决方案23】:

                            如果您从 Jenkins 触发代码,启用“在构建之前启动 Xvfb,然后将其关闭”选项可能会有所帮助。它帮助了我。

                            【讨论】:

                              【解决方案24】:

                              更改为另一个用户并尝试除 root 之外的其他用户。它对我有用。

                              【讨论】:

                                【解决方案25】:

                                我只是在运行 ./studio.sh All set 之前没有退出 root。

                                【讨论】:

                                  【解决方案26】:

                                  适用于 Ubuntu 17.10 安装 X 虚拟帧缓冲区 (xvfb)

                                  apt install xvfb
                                  

                                  并将这些行添加到 /etc/profile 文件中...

                                  # Start the X virtual frame buffer (Xvfb)
                                  if [ -f /usr/X11R6/bin/Xvfb ]; then
                                  /usr/X11R6/bin/Xvfb :1 -screen 0 1366x768x32
                                  fi
                                  
                                  # Set the DISPLAY variable for the X virtual frame buffer (Xvfb)
                                  export DISPLAY=localhost:1.0
                                  

                                  【讨论】:

                                  • 现在我只得到“线程“主”java.awt.AWTError 中的异常:无法使用 'localhost:1.0' 作为 DISPLAY 变量的值连接到 X11 窗口服务器。”在 Ubuntu 16.04 上。 Xvfb 二进制文件现在似乎位于 /usr/bin,而不是 /usr/X11R6/bin,但给了我“无法添加屏幕 0 (EE)”。
                                  【解决方案27】:

                                  在我的情况下,此错误与 DISPLAY 端口无关。我试图将 XML 加载到 Windchill(PLM 软件)中,但在终端上只收到了上述错误。在日志文件中,我发现我的 XML 文件已损坏的报告。也许有人有类似的问题,可以使用这个答案。

                                  【讨论】:

                                    【解决方案28】:

                                    我的问题是防火墙。暂时禁用它。

                                    [编辑] 而且,服务器主机名指向另一个 IP。将其设置为简单的本地服务器。 strace xclock 帮助调试了这个问题。

                                    【讨论】:

                                      【解决方案29】:

                                      我已通过使用 Xorg 登录解决了这个问题。默认情况下,我使用的是 Wayland。看起来 Wayland 消除了 Xorg 的大部分设计缺陷,但它也有自己的问题。

                                      【讨论】:

                                        【解决方案30】:

                                        对我来说,以上都不起作用,但经过长时间的搜索,这对我有用。

                                        export DISPLAY=localhost:20.0
                                        

                                        【讨论】:

                                          猜你喜欢
                                          • 2014-09-17
                                          • 1970-01-01
                                          • 1970-01-01
                                          • 1970-01-01
                                          • 2012-11-24
                                          • 2011-09-29
                                          • 2016-06-19
                                          • 2023-03-21
                                          相关资源
                                          最近更新 更多