アプリケーションの起動時にJava.awt.headless=true
を設定しようとしていますが、手遅れになり、非ヘッドレスモードが既に開始されているようです。
static {
System.setProperty("Java.awt.headless", "true");
/* Java.awt.GraphicsEnvironment.isHeadless() returns false */
}
-Djava.awt.headless=true
の横にヘッドレスをtrueに設定する別の方法はありますか?コンソールでは何も設定しない方がいいでしょう。
私は、定数のJFreeChartのさまざまな部分(およびその他の静的コード)を静的にロードするクラスでmain()
を使用していました。
静的ローディングブロックをクラスの先頭に移動すると、問題が解決しました。
これは機能しません:
public class Foo() {
private static final Color COLOR_BACKGROUND = Color.WHITE;
static { /* too late ! */
System.setProperty("Java.awt.headless", "true");
System.out.println(Java.awt.GraphicsEnvironment.isHeadless());
/* ---> prints false */
}
public static void main() {}
}
Have Java静的ブロックをクラスの先頭に移動することにより、できるだけ早く実行してください!
public class Foo() {
static { /* works fine! ! */
System.setProperty("Java.awt.headless", "true");
System.out.println(Java.awt.GraphicsEnvironment.isHeadless());
/* ---> prints true */
}
private static final Color COLOR_BACKGROUND = Color.WHITE;
public static void main() {}
}
それについて考えるとき、これは完全に理にかなっています:)。ジュフ!
System.setPropertyの呼び出しはツールキットの作成前であるため、これは機能するはずです。
public static void main(String[] args)
{
// Set system property.
// Call this BEFORE the toolkit has been initialized, that is,
// before Toolkit.getDefaultToolkit() has been called.
System.setProperty("Java.awt.headless", "true");
// This triggers creation of the toolkit.
// Because Java.awt.headless property is set to true, this
// will be an instance of headless toolkit.
Toolkit tk = Toolkit.getDefaultToolkit();
// Check whether the application is
// running in headless mode.
GraphicsEnvironment ge =
GraphicsEnvironment.getLocalGraphicsEnvironment();
System.out.println("Headless mode: " + ge.isHeadless());
}
これはまったく異なるアプローチです。
try {
Field defaultHeadlessField = Java.awt.GraphicsEnvironment.class.getDeclaredField("defaultHeadless");
defaultHeadlessField.setAccessible(true);
defaultHeadlessField.set(null,Boolean.FALSE);
Field headlessField = Java.awt.GraphicsEnvironment.class.getDeclaredField("headless");
headlessField.setAccessible(true);
headlessField.set(null,Boolean.TRUE);
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (NoSuchFieldException e) {
e.printStackTrace();
}
これを使用して、ヘッドレス環境(Ubuntu)でサーバー側のBufferedImagesを正常に描画しています。これの良いところは、コマンドラインで-D変数を設定する必要がなく、DISPLAY変数を設定する必要がないことです。
このコードはいつでも実行できます。他のクラスがロードされる前にこれを呼び出すことを心配する必要はありません。
ヘッドレス環境からリモートマシンでSwingインターフェースを駆動しようとした場合、これは機能しない可能性があります。
このパラメーターは、引数としてJava Virtual Machine e.g.
-Djava.awt.headless=true.
これがアプリケーションの他のコンポーネントに影響を与えるかどうかはわかりません。