【问题标题】:HeadlessException Java无头异常 Java
【发布时间】:2016-05-29 06:46:43
【问题描述】:

如果这个问题已经得到解答,请原谅我 - 我看了但找不到任何东西......

我在使用 SSH 运行 java 程序时遇到问题。我在我的 Mac 上本地从终端运行代码没有问题,但是当我尝试通过 SSH 连接到我的 Mac 上的另一个用户时,我得到了 HeadlessException。当我以该用户身份登录并在他们的终端窗口中运行它时,甚至没有任何问题 - 该问题仅在使用 SSH 时出现。

我发出以下命令:

>> ssh -X remoteguest@host
>> java LifeCounter

我收到以下错误:

java.awt.HeadlessException
at java.awt.GraphicsEnvironment.checkHeadless(GraphicsEnvironment.java:204)
at java.awt.Window.<init>(Window.java:536)
at java.awt.Frame.<init>(Frame.java:420)
at javax.swing.JFrame.<init>(JFrame.java:233)
at setupGUI.<init>(LifeCounter.java:156)
at LifeCounter$1.run(LifeCounter.java:18)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:311)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:756)
at java.awt.EventQueue.access$500(EventQueue.java:97)
at java.awt.EventQueue$3.run(EventQueue.java:709)
at java.awt.EventQueue$3.run(EventQueue.java:703)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:726)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)

任何帮助将不胜感激。

TIA

【问题讨论】:

  • 你能详细说明你想要达到的目标吗?
  • 您显然正在运行一个带有图形 UI (awt) 的应用程序。但是当您使用 ssh 时,它只是一个命令行界面和图形用户界面,而不是它的一部分。公平地说,在 Mac(和大多数其他 Unix)上,在其他人的 UI 会话上运行图形 UI 程序在技术上是可行的,但它相当复杂。
  • 是的,对不起 - 我应该更具体。我正在尝试通过远程运行图形应用程序(用 Swing 编写)并使用 SSH 连接到机器。如果我在服务器上本地运行程序,它运行没有问题,如果我在客户端本地运行程序,它运行没有问题。当我尝试使用 XQuartz 转发图形时出现问题
  • 我对 XQuartz 本身有很多经验,但考虑到它是 X Windows。我建议尝试设置 DISPLAY 环境变量。例如。尝试ssh到机器,然后输入命令如下:DISPLAY=:0.0 java LifeCounter
  • 您也可以查看这篇关于在别人的会话中运行应用程序的帖子apple.stackexchange.com/questions/100829/…

标签: java macos ssh


【解决方案1】:

我仍然不确定你到底想做什么。所以,我会尽量涵盖所有的基础。

如果您想通过 ssh 运行图形 UI 应用程序,那根本不可能。图形 UI 根本不是协议的一部分。当您在终端窗口中运行程序时,您的终端窗口会在图形 UI 会话中运行,因此您的程序也可以使用 GUI。但是当你在远程机器上通过 ssh 运行它时,它只是一个没有任何 GUI 的文本终端。

如果您想运行图形 UI,您可以使用提供 UI 的远程协议(例如 vnc、屏幕共享、TeamViewer、Chrome 远程桌面等),也可以使用其他用户图形会话(该计算机本地) 在他/她的屏幕上运行它。

现在,vnc 或屏幕共享很容易设置。

使用其他用户的会话更复杂。请参阅对问题的评论中的this link。请注意,它还取决于目标系统上的 OS X 版本,并且您的里程可能会有所不同。另请注意,您不会看到它正在运行 - 其他用户会看到它并与之交互。

另一种选择是在您的机器上运行 X11 Server(图形 UI),并使您的应用在远程机器上运行,连接回您的 X11 Server。但这更复杂。首先,您需要告诉您的应用连接回您的机器,并且必须首先配置连接(例如端口转发)。更糟糕的是,OS X UI 并不完全是 X11(这就是为什么某些应用程序需要 XQuartz),因此您可能还需要克服一些不兼容的问题。同样,这并非不可能,但相当复杂,恐怕你自己一个人在这里。

【讨论】:

    猜你喜欢
    • 2015-08-18
    • 1970-01-01
    • 1970-01-01
    • 2013-04-15
    • 2015-01-28
    • 2022-10-01
    • 1970-01-01
    • 2014-08-25
    • 1970-01-01
    相关资源
    最近更新 更多