2010-03-31 4 views
30

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

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

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

+2

Вы также можете быть заинтересованы в http://en.wikipedia.org/wiki/Xvfb. – lexicore

ответ

35

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

У ява выполнить статический блок как можно раньше, перемещая его в верхней части класса!

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!

+0

Странно. то, что сработало для меня, заключалось в том, чтобы явно установить 'java.awt.headless' в' false' – kumetix

+0

Установка свойства '' true ''в статическом блоке инициализации работала нормально. @kumetix, возможно, вы попробовали 'true' вместо' 'true ''? – Raffael

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

В этот момент инструментарий, похоже, загружен, поэтому я больше не могу изменить это свойство. статический блок {} должен вызываться еще до основного блока. – reto

3

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

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

+1

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

3

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

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 на удаленной машине из безголовой среды.

0

Вы можете установить JAVA_TOOL_OPTIONS так:

JAVA_TOOL_OPTIONS: -Djava.awt.headless = истина

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

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

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

Вопрос заключается в том, как установить его из приложения WITHIN. – reto

 Смежные вопросы

  • Нет связанных вопросов^_^