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

123
我有一个使用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 Server没有运行,因此我尝试了startx,但它显示该端口正在运行。

我的系统是Ubuntu服务器版10.04。


如果您还通过ssh使用VNC查看器:在修改了xhost访问列表之后,有必要重新打开SSH连接。至少在我的当前设置(从VNC到Debian),我推断需要获取更新的xhost访问列表。 - Technophile
34个回答

73

2
主线程异常:"main" java.awt.HeadlessException 在java.awt.GraphicsEnvironment.checkHeadless(GraphicsEnvironment.java:173)处检查无头。 - Elteroooo
2
谢谢,问题在于X服务器正在另一个端口运行。 - Elteroooo
这对我有用。在Jenkins -> 构建 -> 目标和选项 -> -Djava.awt.headless=true test在我的情况下 clean compile -Djava.awt.headless=true test - user358591
5
问询者的程序想要运行 ij.io.Opener.openJpegOrGif,我们可以猜测这可能需要图形用户界面(GUI)。因此,无界面模式将导致另一个错误:java.awt.HeadlessException - Nicolas Raoul
由于环境无法显示,我得到了一个错误:java.awt.AWTException。 - Pankaj Kumar Katiyar
显示剩余5条评论

52

移除DISPLAY变量

unset DISPLAY

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

将其添加到专用应用程序服务器/工具用户的.bash_profile中也很方便。


3
我会尽力为您翻译:它完全没有帮助我。我得到了这个信息:AWT无法连接到X11窗口服务器。 - Pankaj Kumar Katiyar
如果您的应用程序使用awt,则必须正确设置DISPLAY。这适用于不使用awt的应用程序。 - bebbo
1
在尝试这个操作时,请确保在bash文件中添加unset命令后重新启动mobaXterm。因为显示变量将在之前设置,并且仅运行bash文件不会改变它。 - mrk
这在我使用Putty + Xming Server:0.0时有效。不幸的是,当我使用wsl2时出现了相同的错误。我还没有尝试过mobaXterm,但是添加未设置命令后,您需要重新启动Xming。 - Viki Liu

50

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

export DISPLAY=:0

47
unset DISPLAY 帮助了我(使用 export DISPLAY=:0 时出现错误 Can't connect to X11 window server using ':0')。 - beluchin
3
有时,某些程序在Linux下可能无法正常运行,此时可以使用apt安装Xvfb,并在任何屏幕上运行它,例如:Xvfb :1,然后在构建阶段设置变量 -- 导出DISPLAY=:1 --> 这样完美地解决了问题。 - Pankaj Kumar Katiyar
请阅读:此链接 https://dev59.com/FnrZa4cB1Zd3GeqP00wR - Felix Aballi

30

我认为你正在使用sudo模式工作。请切换到用户模式并重试。


7
这也是我的问题。不能以root身份运行似乎很奇怪,不是吗? - barbiepylon
为什么我不能使用sudo? - Andrea Borgogelli Avveduti
@javajavajava 是的 - Harsh V Pillai
1
对我有用。我认为在我的情况下,只有当前会话的所有者即root才能启动X11服务器。 - denniz crypto
对我来说似乎是同样的问题。不得不从我的GitLab管道中启动Xvfb,无法在Docker镜像本身中执行此操作。 - Jacob van Lingen

9

如果有人试图通过maven-surefire-plugin在CI(jenkins,..)上运行自动化单元测试,并且遇到了上述错误,请确保更新您的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>

1
如何在Gradle中实现以及如何设置属性值。 - Sobhit Sharma

8
这将修复它:
/usr/bin/java -Djava.awt.headless=true $Your_program

3
没有修复我的。 - Alex Shnyrov
1
这对我很有效。谢谢。我之前一直出错,是因为我正在使用poi。 - dev4life

7

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

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

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


6
这解决了我的问题。
xhost +

请注意,xhost + 命令完全取消了认证,允许任何人访问你屏幕上的所有应用程序。

xhost +si:localuser:root 命令似乎使用适当的身份验证类似于前者。


6

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

如何为切换账户使用sudo的用户设置X11转发(X11 Forwarding)并导出远程显示?

4

第一步:启动XQuartz

第二步:ssh -X user@ip_address

...: 启动你的进程

如果你先进行ssh,然后再启动XQuartz,你会遇到错误。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接