繁体   English   中英

Java 无法使用“localhost:10.0”作为 DISPLAY 变量的值连接到 X11 window 服务器

[英]Java Can't connect to X11 window server using 'localhost:10.0' as the value of the DISPLAY variable

我有一个脚本使用 java 连接以在本地主机的端口 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

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

删除 DISPLAY 变量

unset DISPLAY

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

也可以很方便地将它添加到 .bash_profile 以供专用的 app-server/tools 用户使用。

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

export DISPLAY=:0

我认为您在 sudo 模式下工作。请检查到用户模式并重试

如果有人试图通过 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>

这将修复它:

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

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

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

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

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

使用 -X 选项和 ssh 连接远程主机。

# ssh -X root@remote-host

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

# 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/

在使用无头软呢帽 22 在 raspberry pi 2 上安装 glassfish 的几天徒劳无功之后,下面对我来说没有任何问题

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

这里得到我的帮助

第一:启动XQuartz

第二个:ssh -X user@ip_address

...:开始你的过程

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

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

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

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

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

unset DISPLAY
export DISPLAY=:0

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

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

这解决了我的问题

xhost +

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

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

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

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

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

回声 $DISPLAY

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

出口显示=:0.0

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

我在我正在处理的 Linux 服务器上遇到了同样的问题。 将 java 连接到 X11 显示器在头节点上工作,但在任何其他节点上都不起作用。 联系管理员后,发现我们的作业调度系统(SLURM)当前版本不支持X11转发。 他们必须更新 SLURM(新版本的 SLURM 支持它)才能工作。

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

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

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

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

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

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

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

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

对于 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

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

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

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

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

对我来说,以上都没有奏效,但经过长时间的搜索,这对我有用。

export DISPLAY=localhost:20.0
  1. 导出本地主机:1

  2. -Djava.awt.headless=true

对我来说,问题是未安装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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM