Настройка java.ОУ.headless=true программно

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

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

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

5 ответов


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

думая об этом, это делает совершенно чувство.): Юху!


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

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

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


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

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 в командной строке, и вам не нужно устанавливать переменную отображения.

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

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


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

JAVA_TOOL_OPTIONS: - Djava.ОУ.безголовый=истина

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

вы также можете добавить его в первую строку скрипта groovy следующим образом:

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