Установка java.awt.headless = true программно - PullRequest
33 голосов
/ 31 марта 2010

Я пытаюсь установить java.awt.headless=true во время запуска приложения, но кажется, что я опоздал, и режим без заголовка уже запущен:

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

Есть ли другой способ установить безглавый истинный, кроме -Djava.awt.headless=true? Я бы предпочел не настраивать что-либо на консоли.

Ответы [ 5 ]

38 голосов
/ 31 марта 2010

Я работал с 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() {}
  }

Размышляя об этом, это вполне логично :). Juhu!

4 голосов
/ 31 марта 2010

Это должно работать, потому что вызов 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());
}
3 голосов
/ 16 августа 2011

Здесь совершенно другой подход.

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

Я успешно использую это для рисования BufferedImages на стороне сервера в автономной среде (Ubuntu). Приятно то, что для этого не требуется устанавливать переменные -D в командной строке, а также не нужно устанавливать переменную DISPLAY.

Вы также можете выполнить этот код в любое время. Вам не нужно беспокоиться о вызове этого до загрузки других классов.

Полагаю, это может не сработать, если вы пытаетесь управлять интерфейсом Swing на удаленном компьютере из автономной среды.

3 голосов
/ 12 января 2011

Я думаю, что этот параметр можно установить, передав его в качестве аргумента виртуальной машине Java, например

-Djava.awt.headless=true. Не уверен, что это повлияет на другие компоненты вашего приложения.

0 голосов
/ 13 декабря 2015

Вы можете установить JAVA_TOOL_OPTIONS следующим образом:

JAVA_TOOL_OPTIONS: -Djava.awt.headless = true

Тогда любые новые процессы будут использовать эту настройку во время сеанса. Вы можете добавить его в свой .bashrc или .bash_profile (или любой файл запуска оболочки) для всех последующих сеансов.

Вы также можете добавить его в первую строку Groovy-скрипта, например так:

cat hello.groovy
#!/usr/bin/env groovy -Djava.awt.headless=true
println hello
...