Настройка 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