“没有X11 DISPLAY变量” - 这是什么意思?

127

我正在尝试在我的Linux机器(Slackware)上安装一个Java应用程序。

我收到了以下错误,但我不理解它。

你能建议我如何解决这个问题吗?谢谢。

这是我的输出:(我看到需要设置一些X11 DISPLAY变量,但应该给它什么值以及如何设置?)

~$ java -jar gate-5.0-beta1-build3048-installer.jar
- ERROR -

java.awt.HeadlessException:
No X11 DISPLAY variable was set, but this program performed an operation which requires it.
java.awt.HeadlessException:
No X11 DISPLAY variable was set, but this program performed an operation which requires it.
at java.awt.GraphicsEnvironment.checkHeadless(Graphic sEnvironment.java:159)
at java.awt.Window.<init>(Window.java:407)
at java.awt.Frame.<init>(Frame.java:402)
at net.sourceforge.mlf.metouia.borders.MetouiaDotsBuf fer.<init>(MetouiaDotsBuffer.java:105)
at net.sourceforge.mlf.metouia.borders.MetouiaDots.<i nit>(MetouiaDots.java:66)
at net.sourceforge.mlf.metouia.borders.MetouiaToolBar Border.<init>(MetouiaToolBarBorder.java:49)
at net.sourceforge.mlf.metouia.MetouiaLookAndFeel.ini tComponentDefaults(MetouiaLookAndFeel.java:241)
at javax.swing.plaf.basic.BasicLookAndFeel.getDefault s(BasicLookAndFeel.java:130)
at javax.swing.plaf.metal.MetalLookAndFeel.getDefault s(MetalLookAndFeel.java:1591)
at javax.swing.UIManager.setLookAndFeel(UIManager.jav a:537)
at javax.swing.UIManager.setLookAndFeel(UIManager.jav a:581)
at com.izforge.izpack.installer.GUIInstaller.loadLook AndFeel(GUIInstaller.java:373)
at com.izforge.izpack.installer.GUIInstaller.<init>(G UIInstaller.java:116)
at sun.reflect.NativeConstructorAccessorImpl.newInsta nce0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInsta nce(NativeConstructorAccessorImpl.java:39)
at sun.reflect.DelegatingConstructorAccessorImpl.newI nstance(DelegatingConstructorAccessorImpl.java:27)
at java.lang.reflect.Constructor.newInstance(Construc tor.java:513)
at java.lang.Class.newInstance0(Class.java:355)
at java.lang.Class.newInstance(Class.java:30
at com.izforge.izpack.installer.Installer.main(Instal ler.java:62)

我遇到了同样的问题,在控制台上它可以完美运行,但是当我在Eclipse中使用时,它会抛出相同的异常。我甚至加入了这些代码行:Process proc_exporting = Runtime.getRuntime().exec("sudo export DISPLAY=:0.0"); 但仍然无法正常工作。 - hb.Sara
3
没有一个答案提供了连接到远程控制台(通过puTTY)所需的信息。任何解决SSH的答案都没有真正解释如何使其工作。有人知道有关此问题的解决方案吗? - user2700923
13个回答

142

如果你在主屏幕上,那么

export DISPLAY=:0.0

如果你正在使用csh或tcsh

setenv DISPLAY :0.0

在运行应用程序之前。

实际上,我很惊讶它没有自动设置。您是否尝试从非图形终端启动此应用程序?如果不是,请问您修改了默认的 .profile、.login、.bashrc 或 .cshrc 文件吗?

请注意,将 DISPLAY 设置为 :0.0 假定您坐在主显示器前,正如我所说,或者至少主显示器已登录到您的用户 ID。如果未登录,或者登录的是其他用户 ID,则此操作将失败。

如果您从另一台机器进入,并且您正在该机器的主显示器前并且其正在运行 X,则可以使用 "ssh -X hostname" 连接到该主机,ssh 将发送 X 显示回来。ssh 也会确保 DISPLAY 环境变量设置正确(只要它未被我上面提到的各种点文件所干扰)。在 "ssh -X" 会话中,DISPLAY 环境变量的值将类似于 "localhost:11.0",指向 ssh 正在隧道传输到本地计算机的套接字。


嗨,非常感谢,第一个方法对我有用。是的,我从非图形终端开始运行它。 - user42155
听起来好像它想要访问图形显示。请注意,当图形显示不可用或属于其他用户ID时,请勿运行它。 - Paul Tomblin
3
请注意,这个方法是在你使用控制台的情况下可行的。如果你在另一个终端上,你需要在该终端上运行一个X服务器,并将环境变量设置为指向你的机器(例如,设置export DISPLAY='Paul终端的主机名':0.0)。 - KevinDTimm
1
如果您需要运行需要连接到 X 服务器的自动化任务,可以查看 xvfb,它可以创建一个虚拟的 X 服务器。这对于一些批量测试或运行测试非常有用。 - Wichert Akkerman
在Windows系统上,我使用Putty+Nomachine远程登录到我的Linux虚拟机。在gnome GUI环境下,我启动了一个终端以ssh到另一台机器。当我尝试在ssh会话中运行GUI应用程序时,我遇到了相同的错误。然后,通过使用“ssh -X”命令,问题得以解决。 - Jeff.Lu
显示剩余3条评论

11

你必须在PuTTy中启用X11转发

要做到这一点,请打开PuTTy,进入连接= > SSH =>通道并选中启用X11转发复选框。

此外,在服务器上使用sudo并导出以下变量,其中IP是您本地机器的IP。

export DISPLAY=10.75.75.75:0.0

输入图片说明


它也适用于通过MobaXTerm连接。 - Tunahan

10

你是在X11环境中运行这个程序吗?你可以使用终端窗口,但必须在X环境内(要么是在图形登录后,要么是运行startx之后)。

如果你已经在图形环境中了,尝试对于基于bash的shell(如bash、sh等),使用export DISPLAY=:0命令;或对于基于C shell的shell(如csh、tcsh等),使用setenv DISPLAY :0命令。

如果你通过SSH从另一台机器连接过来,可以使用-X选项将图形界面显示到你所在的机器上(需要在那里运行X服务器,例如Windows的xming和标准的Linux X服务器)。


哦对,Slackware。它现在还像10年前我最后一次使用时那么简陋吗? - Paul Tomblin
它仍然默认在运行级别3中启动。当然,如果你告诉它在运行级别5中启动,假设你已安装了 KDE,你会得到一个漂亮的 KDM 登录菜单。 - Adam Jaskiewicz
在 CentOS 和 SSH(putty)中使用:“export DISPLAY=:0” - jacktrades

5

有很多方法可以做到这一点。我使用下面的方法,对我来说很方便且总是有效的。

  1. 在远程服务器上,确保安装了 xorg-x11-xauth、xorg-x11-font-utils 和 xorg-x11-fonts。
  2. 在本地桌面上运行 Xming 服务器。
  3. 通过 putty,在 ssh 连接服务器之前,启用 X11 转发并将显示位置设置为 localhost:0.0。
  4. 在服务器上,生成 .Xauthority 文件并注意已经设置了 DISPLAY 变量。

    $ xauth list

    $ xauth add

要测试它,请键入 xclock 或 xeyes。

注意:要切换用户,请将 .Xauthority 文件复制到相应用户的主目录中,并从该用户导出 DISPLAY 变量。


4

在类似于描述的情况下可能存在的一个问题是,当远程端未安装“xauth”程序时,X未被转发且$ DISPLAY未设置。您可以在运行“ssh -Xv ip_address”时查看它是否搜索到它,如果没有找到,则失败,除非您打开详细模式(fail IMO)。通常可以在同名包中找到“xauth”。


3
非常简单,我遇到了同样的问题,然后我下载并安装了一个应用程序来帮助显示,然后修复了错误。
下载此应用程序 xming:

http://sourceforge.net/project/downloading.php?

安装后,请使用此链接上的设置:

http://www.geo.mtu.edu/geoschem/docs/putty_install.html 或按照以下步骤进行:

安装/配置PuTTy和Xming

一旦将PuTTy和Xming下载到计算机上,根据各自的说明进行安装。

配置Xming

安装Xming后,运行名为“XLaunch”的应用程序,并验证设置是否如下所示:

  • 在显示设置窗口上选择默认条目,然后单击下一步
  • 在会话类型窗口上单击下一步
  • 在附加参数窗口上单击下一步(注意剪贴板复选框为真)
  • 保存配置并单击完成

配置PuTTy

安装PuTTy后,在桌面上双击PuTTy图标,然后按照以下方式进行配置:

这显示创建登录配置文件然后保存它。

  • 在ssh-> X11上,点击复选框以启用X11转发。
  • 在X显示位置文本框中,输入localhost:0.0

保存配置文件,然后远程连接服务器进行测试。

干杯!!!


请在答案中包含链接中的基本信息,因为它们可能会失效,使答案无用。 - plamut

3

如果您的应用程序具有GUI或没有GUI,则有两种可能性:

1-) 如果您的Java应用程序具有GUI,请首先确保您已正常安装了jdk软件包(非无头)。例如,如果您安装了以下内容:

sudo apt install openjdk-19-jre-headless

删除它:

sudo apt remove openjdk-19-jre-headless

然后安装普通版本:

sudo apt install openjdk-19-jre

Simply headless是用于无GUI应用程序的。您可以在此处查看更多信息:openjdk-6-jre、openjdk-6-jre-headless、openjdk-6-jre-lib之间的区别

然后,尝试将DISPLAY变量设置为:

export DISPLAY=:0

或者如果它不起作用(那么,可能是因为您有多个显示器),请设置为:

export DISPLAY=:1

然后运行你的jar文件:

java -jar gate-5.0-beta1-build3048-installer.jar

2-) 如果你的Java应用程序没有GUI界面,在运行应用程序时,你可以尝试使用java.awt.headless=true标志:

java -Djava.awt.headless=true -jar gate-5.0-beta1-build3048-installer.jar

卸载jre-headless并安装正常版本,然后导出DISPLAY=:1解决了我的问题,谢谢! - fredjaya

1

对于那些试图在Windows从Linux中运行X Window应用程序的人:

对我而言有效的方法是在我的Windows机器上设置xming服务器,在连接到Linux主机时在putty中设置X11转发选项,并输入我的Windows IP地址和显示端口,然后再输入显示变量和我的Windows IP地址:0.0。

别忘了将Linux主机的IP地址添加到X0.hosts文件中,以确保xming服务器接受来自该主机的流量。我花了一段时间才弄清楚这一点。


1
export DISPLAY=172.16.1.148:0.0

172.16.1.148 是您的计算机 IP 地址。

0

我在Ubuntu 14.04.01中遇到了同样的问题,当我尝试安装JDK 8和Netbeans时,如果我在Byobu终端中启动脚本(也许在Screens中发生了同样的情况),就会出现这个问题。

只需退出Byobu并在图形终端中运行脚本即可。


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