web-dev-qa-db-ja.com

Java.awt.headless = trueをプログラムで設定する

アプリケーションの起動時にJava.awt.headless=trueを設定しようとしていますが、手遅れになり、非ヘッドレスモードが既に開始されているようです。

static {
    System.setProperty("Java.awt.headless", "true");
    /* Java.awt.GraphicsEnvironment.isHeadless() returns false */
}

-Djava.awt.headless=trueの横にヘッドレスをtrueに設定する別の方法はありますか?コンソールでは何も設定しない方がいいでしょう。

33
reto

私は、定数の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() {}
  }

それについて考えるとき、これは完全に理にかなっています:)。ジュフ!

38
reto

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());
}
4
pitpod

これはまったく異なるアプローチです。

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インターフェースを駆動しようとした場合、これは機能しない可能性があります。

3
Carl Sayres

このパラメーターは、引数としてJava Virtual Machine e.g.

-Djava.awt.headless=true.これがアプリケーションの他のコンポーネントに影響を与えるかどうかはわかりません。

3
Bharat Joshi