35

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

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

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

4

5 に答える 5

41

main()私は、定数(およびその他の静的コード)でJFreeChartのさまざまな部分を静的にロードするクラスで作業していました。

静的ローディングブロックをクラスの一番上に移動すると、私の問題は解決しました。

これは機能しません:

  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() {}
  }

静的ブロックをクラスの最上位に移動して、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() {}
  }

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

于 2010-03-31T11:32:12.753 に答える
4

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());
}
于 2010-03-31T11:22:20.263 に答える
4

これは完全に異なるアプローチです。

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

于 2011-08-16T00:43:12.647 に答える
3

このパラメータは、Java仮想マシンに引数として渡すことで設定できると思います。

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

于 2011-01-12T09:56:27.553 に答える
1

JAVA_TOOL_OPTIONS次のように設定できます。

JAVA_TOOL_OPTIONS:-Djava.awt.headless = true

Then any new processes will use that setting during the session. You can add it to your .bashrc or .bash_profile (or whatever shell's startup file) for all subsequent sessions.

You can also add it to the first line of a groovy script like this:

cat hello.groovy
#!/usr/bin/env groovy -Djava.awt.headless=true
println hello
于 2015-12-13T07:13:33.460 に答える