gpt4 book ai didi

java - 如何从远程 ssh 终端在 Mac 上运行 java UI 应用程序?

转载 作者:行者123 更新时间:2023-12-01 22:33:54 26 4
gpt4 key购买 nike

更新:不适用于最新的 macOS 版本 (Mohave+)

在 Mac 上,您可以通过 ssh 连接并运行应用程序,而无需任何 DISPLAY 设置,例如open . 将从远程终端在 Mac 屏幕上运行 Finder。

这不适用于 Java 应用程序:

java -jar demo/jfc/Font2DTest/Font2DTest.jar 

会抛出:

Exception in thread "main" java.awt.HeadlessException
at java.awt.GraphicsEnvironment.checkHeadless(GraphicsEnvironment.java:207)
at java.awt.Window.<init>(Window.java:536)
at java.awt.Frame.<init>(Frame.java:420)
at javax.swing.JFrame.<init>(JFrame.java:225)
at Font2DTest.main(Font2DTest.java:1032)

任何使用 DISPLAY 值的实验都没有帮助。

最佳答案

在 JDK8 中,您可以使用 AWT_FORCE_HEADFUL 环境变量来克服这个问题:

AWT_FORCE_HEADFUL=true java -jar demo/jfc/Font2DTest/Font2DTest.jar 

不幸的是,JDK7 中没有简单的方法。

该问题隐藏在 Mac headless 模式检测中。接下来的代码检查应用程序是否处于“Aqua” session 中,否则强制 headless 。

// jdk/src/solaris/native/java/lang/java_props_macosx.c
int isInAquaSession() {
// environment variable to bypass the aqua session check
char *ev = getenv("AWT_FORCE_HEADFUL");
if (ev && (strncasecmp(ev, "true", 4) == 0)) {
// if "true" then tell the caller we're in an Aqua session without actually checking
return 1;
}
// Is the WindowServer available?
SecuritySessionId session_id;
SessionAttributeBits session_info;
OSStatus status = SessionGetInfo(callerSecuritySession, &session_id, &session_info);
if (status == noErr) {
if (session_info & sessionHasGraphicAccess) {
return 1;
}
}
return 0;
}

// jdk/src/solaris/native/java/lang/java_props_md.c

// check if we're in a GUI login session and set java.awt.headless=true if not
sprops.awt_headless = isInAquaSession() ? NULL : "true";

关于java - 如何从远程 ssh 终端在 Mac 上运行 java UI 应用程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27171084/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com