110

我有一个脚本使用 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 服务器版 10.04

4

31 回答 31

65

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

于 2012-04-15T20:42:39.433 回答
43

删除 DISPLAY 变量

unset DISPLAY

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

也可以很舒服地将其添加到 .bash_profile 以供专用的应用程序服务器/工具用户使用。

于 2012-12-10T21:20:53.063 回答
42

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

export DISPLAY=:0
于 2013-02-25T13:54:11.940 回答
24

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

于 2017-07-05T09:07:58.410 回答
9

如果有人试图通过 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>
于 2014-05-22T13:47:05.183 回答
8

这将解决它:

/usr/bin/java -Djava.awt.headless=true $Your_program
于 2012-07-17T15:00:53.190 回答
6

对我来说,以-Y而不是 -X 身份登录有效。

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

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

于 2017-07-03T10:46:31.660 回答
5

如果您尝试使用 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/

于 2020-04-14T11:57:47.223 回答
3

经过几天徒劳的努力,在带有无头 Fedora 22 的树莓派 2 上安装 glassfish,下面为我工作顺利

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

从这里得到我的帮助

于 2016-02-27T01:26:23.640 回答
3

第一:启动XQuartz

二:ssh -X user@ip_address

...:开始你的过程

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

于 2016-10-28T21:05:28.130 回答
3

这解决了我的问题

xhost +

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

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

于 2020-06-25T13:41:03.750 回答
2

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

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

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

于 2017-04-13T14:38:49.720 回答
2

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

unset DISPLAY
export DISPLAY=:0

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

于 2018-09-05T07:42:50.203 回答
2

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

于 2018-12-05T05:47:36.007 回答
1

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

于 2015-12-14T08:11:51.680 回答
1

就我而言,我的机器中没有剩余空间,我也面临同样的问题。有时可能是空间问题。检查您的 Linux/Unix 环境中的空间并确保您的机器有足够的空间。

于 2017-01-02T05:36:40.407 回答
1

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

回声 $DISPLAY

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

导出显示=:0.0

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

于 2020-04-23T17:01:24.250 回答
1

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

于 2020-11-01T12:09:59.570 回答
0

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

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

于 2013-04-24T17:02:40.313 回答
0

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

于 2013-05-02T05:48:27.633 回答
0

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

于 2013-11-01T16:15:15.103 回答
0

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

于 2015-10-12T11:16:15.540 回答
0

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

于 2017-09-13T05:46:19.190 回答
0

更改为另一个用户并尝试除root之外。这个对我有用。

于 2017-09-20T18:07:09.813 回答
0

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

于 2018-01-06T21:41:14.733 回答
0

对于 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
于 2018-02-16T19:15:33.733 回答
0

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

于 2018-09-04T07:56:02.410 回答
0

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

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

于 2019-10-28T05:18:00.583 回答
0

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

于 2020-02-25T09:38:31.497 回答
0

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

export DISPLAY=localhost:20.0
于 2020-09-14T13:44:17.417 回答
-1

对我来说,问题是没有安装xorg-x11-xauth 。我安装了它,然后它工作了。

我现在拥有的软件包是:

  • libX11-common-1.6.3-2.el6.noarch
  • libX11-1.6.3-2.el6.i686
  • libX11-1.6.3-2.el6.x86_64
  • xorg-x11-drv-ati-firware-7.6.1-2.el6.noarch
  • xorg-x11-xauth-1.0.9-1.el6.x86_64
于 2016-11-01T14:19:41.950 回答