更新:最新の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のヘッドレスモードの検出に隠されています。次のコードは、アプリが「アクア」セッションにあることを確認し、そうでない場合はヘッドレスを強制します。
// 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";
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加