【问题标题】:How to run a java GUI on mac osx after ssh如何在 ssh 后在 mac osx 上运行 java GUI
【发布时间】:2014-10-06 18:20:59
【问题描述】:

我在 mac osx 10.7.5 上使用 java 1.7.0_67。这是我的hello world gui:

import javax.swing.*; 
import java.awt.*; 
import java.awt.event.*; 

public class helloWorld extends JFrame {
    helloWorld(String title) { 
        this.setSize(500,500); 
        setTitle(title); 
    }

    public static void main(String[] args) {
       helloWorld window = new helloWorld("Helloworld");
       window.setVisible(true);
       window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    }
}

当我打开一个 mac 终端并输入 java helloWorld 时,它运行得很好。但是,当我从另一台主机 ssh 进入我的 mac,设置我的 DISPLAY 环境变量并运行时,我得到以下异常:

Exception in thread "main" java.awt.HeadlessException:
No X11 DISPLAY variable was set, but this program performed an operation which requires it.
    at java.awt.GraphicsEnvironment.checkedHeadless(GraphicsEnvironment.java:207)
    at java.awt.Window.<init>(Window.java:535)
    at java.awt.Frame.<init>(Frame.java:420)
    at java.awt.Frame.<init>(Frame.java:385)
    at javax.swing.JFrame.<init>(JFrame.java:180)
    at helloWorld.<init>(helloWorld.java:8)
    at helloWorld.main(helloWorld.java:14)

这曾经在 Java 1.6 上工作,根据我的研究,这似乎是一个有目的的突破。

有什么想法可以在从远程主机 ssh-ing 后显示我的 gui 吗?我不想使用 X11(更喜欢原生 gui 渲染)。

【问题讨论】:

  • 不幸的是,这不起作用。 -Djava.awt.headless=false 也不适合我。据我了解,这是一个特定于 mac 的问题,因为 mac osx 如何设置通过终端启动的终端与通过 ssh 启动的终端。 ssh -X 也不起作用
  • 使用 ssh -X 在 ssh 下强制执行 X11 协议隧道。
  • 谢谢 - 我看过那个,但那是关于在 linux 机器上显示,而不是在 mac os x 上 - 就此而言,我什至不知道为什么错误提到 X11,因为我不是使用 X11 并原生显示 gui
  • @Jean-BaptisteYunès 不幸的是,这不起作用 - 这里我直接使用 mac os 来显示 gui,而不是 X11

标签: java macos ssh terminal


【解决方案1】:

Java 开发人员chose to use the headless Toolkit 在 Mac OS X 上运行 ssh 会话时。您可以通过将 AWT_TOOLKIT 环境变量设置为 CToolkit 来说服 Java 继续显示 GUI。例如,在 bash 中:

export AWT_TOOLKIT=CToolkit
java helloWorld

设置变量后,您的 GUI 应该会按预期显示。

【讨论】:

  • @duskwuff - 这对我有用,很好奇你对这个解决方案的看法
  • 当我有多个用户登录到具有多个桌面的 Mac 时,这甚至可以工作:似乎它是通过用户 ID 选择的,这是有道理的。
  • 虽然奇​​怪的是,它在我的 MBP 上不起作用——只是在我们作为构建代理的 Mac Mini 上。也许是因为我在本地有(有)一个 Quartz 会话?我可以轻松地“打开 /Applications/Sikuli.app”并在 Dock 上看到一个图标,因此登录会话以某种方式进行通信。
  • MBP 上的 Java 1.8.0_45 和 mac mini 上的 1.7.0_71 也可能是一个因素。
  • 是的 - 将 1.7 复制到我的 MBP 并将 JAVA_HOME 设置为它。结合AWT_TOOLKIT,在Mac桌面上愉快的从ssh启动。
【解决方案2】:

你不能。要连接到 Mac OS X 上的窗口服务器,进程必须在当前用户的login session 中。 SSH 不是登录会话的一部分,因此通过 SSH 运行的进程无法连接到窗口服务器,因此无法显示 GUI。

【讨论】:

  • 真的吗?我可以在 mac osx 10.7.3 和 Java 1.6.0_29 上做到这一点,版本之间有什么变化吗?无论如何,我可以通过任何方式伪造这个(例如设置环境变量,更改一些配置文件等)?
  • 我不知道为什么这可能适用于以前版本的 Mac OS X。不,没有办法覆盖这种行为。
  • 我可以在 ssh shell 中“打开 some.jpg”,它会出现在我的桌面上,“打开 some.sh”将执行“some.sh”; exit' 在定义了所有桌面环境变量的终端窗口中,如果我使用 -W 选项,它将等待应用程序退出(尽管令人讨厌的是它不会在 --args 之后传递参数),所以这个答案严格来说不是真的。 (虽然我以管理员身份运行)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-06-15
  • 2011-04-05
  • 2018-05-02
  • 1970-01-01
  • 2014-11-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多