2010-03-31 20 views
30

estoy tratando de establecer java.awt.headless=true durante el inicio de la aplicación, pero parece como si fuera demasiado tarde y el modo no sin cabeza ya ha comenzado:Ajuste java.awt.headless = true programación

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

Es Hay otra manera de establecer sin cabeza a la verdad al lado -Djava.awt.headless=true? Preferiría no configurar nada en la consola.

+2

Puede que le interesen también http://en.wikipedia.org/wiki/Xvfb. – lexicore

Respuesta

35

yo estaba trabajando con un main() en una clase que se carga estáticamente diferentes partes de JFreeChart en Constantes (y otra código estático).

Mover el bloque de carga estática a la parte superior de la clase resolvió mi problema.

esto no funciona:

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

tiene Java ejecuta el bloque estático tan pronto como sea posible al moverlo a la parte superior de la clase!

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

Cuando se piensa que esto hace perfectamente sentido :). Juhu!

+0

Eso es raro. Lo que funcionó para mí fue establecer explícitamente 'java.awt.headless' a' false' – kumetix

+0

Establecer la propiedad a '" true "' en el bloque de inicialización estático funcionaba bien. @kumetix tal vez probaste 'true' en lugar de' "true" '? – Raffael

4

Esto debería funcionar porque la llamada a System.setProperty es antes de la creación del juego de herramientas:

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

En ese momento, parece que el kit de herramientas ya está cargado, por lo que ya no puedo cambiar esa propiedad. el bloque estático {} debe llamarse incluso antes del bloque principal. – reto

3

Creo que este parámetro se puede establecer pasándolo como un argumento para Java Virtual Machine, p. Ej.

-Djava.awt.headless=true. No estoy seguro si esto tendría un impacto en otros componentes de su aplicación.

+1

"¿Hay alguna otra manera de establecer sin cabeza = verdadero al lado de -Djava.awt.headless? Preferiría no configurar nada en la consola." – reto

3

Aquí hay un enfoque completamente diferente.

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

Estoy utilizando esto con éxito para dibujar en BufferedImages del lado del servidor en un entorno sin cabeza (Ubuntu). Lo bueno de esto es que no requiere establecer ninguna variable -D en la línea de comandos, ni necesita establecer la variable DISPLAY.

También puede ejecutar este código en cualquier momento. No necesita preocuparse por invocar esto antes de que se carguen otras clases.

Supongo que esto podría no funcionar si intentas manejar una interfaz Swing en una máquina remota desde un entorno sin cabeza.

0

Puede configurar los JAVA_TOOL_OPTIONS así:

JAVA_TOOL_OPTIONS: -Djava.awt.headless = true

Entonces todo nuevo proceso usará esa configuración durante la sesión. Puede agregarlo a su .bashrc o .bash_profile (o al archivo de inicio de cualquier shell) para todas las sesiones posteriores.

También puede añadir a la primera línea de un guión maravilloso como esto:

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

La pregunta era cómo configurarlo DENTRO de la aplicación. – reto