web-dev-qa-db-fra.com

Définition de Java.awt.headless = true par programme

J'essaie de définir Java.awt.headless=true lors du démarrage de l'application mais il semble que je suis trop tard et que le mode sans tête a déjà commencé:

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

Y a-t-il un autre moyen défini sans tête à vrai à côté de -Djava.awt.headless=true? Je préférerais ne rien configurer sur la console.

33
reto

Je travaillais avec une main() dans une classe qui charge statiquement différentes parties de JFreeChart dans les constantes (et autres codes statiques).

Déplacer le bloc de chargement statique en haut de la classe a résolu mon problème.

Cela ne fonctionne pas:

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

Demandez à Java d'exécuter le bloc statique le plus tôt possible en le déplaçant en haut de la classe!

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

En y réfléchissant, cela est parfaitement logique :). Juhu!

38
reto

Cela devrait fonctionner car l'appel à System.setProperty est avant la création de la boîte à outils:

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

Voici une approche complètement différente.

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

J'utilise cela avec succès pour dessiner sur BufferedImages côté serveur dans un environnement sans tête (Ubuntu). La bonne chose à ce sujet est qu'il ne nécessite pas de définir de variables -D sur la ligne de commande, ni de définir la variable DISPLAY.

Vous pouvez également exécuter ce code à tout moment. Vous n'avez pas à vous soucier de l'invoquer avant le chargement d'autres classes.

Je suppose que cela pourrait ne pas fonctionner si vous tentiez de piloter une interface Swing sur une machine distante à partir d'un environnement sans tête.

3
Carl Sayres

Je pense que ce paramètre peut être défini en le passant comme argument à Java Virtual Machine par exemple.

-Djava.awt.headless=true. Je ne sais pas si cela aurait un impact sur d'autres composants de votre application.

3
Bharat Joshi