what jre java awt headless

jre - Configuración java.awt.headless=verdadero programáticamente



headless jre (5)

Estoy tratando de establecer java.awt.headless=true durante el inicio de la aplicación, pero parece que ya es demasiado tarde y el modo no sin cabeza ya ha comenzado:

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

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


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 usando 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 comando, 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.


Creo que este parámetro se puede establecer pasándolo como un argumento para Java Virtual Machine, por ejemplo

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


Estaba trabajando con main() en una clase que carga estáticamente diferentes partes de JFreeChart en constantes (y otro 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() {} }

Haga que Java ejecute el bloque estático tan pronto como sea posible moviéndolo 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() {} }

Al pensar en esto, esto tiene mucho sentido :). Juhu!


Esto debería funcionar porque la llamada a System.setProperty es anterior a la creación del toolkit:

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


Puede configurar JAVA_TOOL_OPTIONS de la siguiente manera:

JAVA_TOOL_OPTIONS: -Djava.awt.headless = true

Entonces, cualquier proceso nuevo 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 agregarlo a la primera línea de un script maravilloso como este:

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