Réglage de java.awt.headless=true par programmation

je suis en train de définir java.awt.headless=true au démarrage de l'application mais il semble que je suis en retard et le mode non-headless a déjà commencé:

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

y a-t-il une autre façon de mettre headless à true à côté de -Djava.awt.headless=true? Je préfère ne rien configurer sur la console.

31
demandé sur Kasun Siyambalapitiya 2010-03-31 15:17:03

5 réponses

je travaillais avec un

déplacer le bloc de chargement statique vers le 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() {}
  }

java exécuter la statique de bloquer le plus tôt possible en le déplaçant vers le 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 fait parfaitement sens :). Juhu!

36
répondu reto 2015-12-01 17:56:22

Cela devrait fonctionner car l'appel Système.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
répondu pitpod 2010-03-31 11:22:20

je pense que ce paramètre peut être réglé en passant, comme un argument de la Machine Virtuelle Java par exemple,

-Djava.awt.headless=true. Je ne suis pas certain que cela aurait un impact sur les autres composantes de votre demande.

3
répondu Bharat Joshi 2011-01-12 09:56:27

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

Je m'en sers avec succès pour dessiner des BufferedImages côté serveur dans un environnement sans tête (Ubuntu). Ce qui est bien, c'est qu'il n'est pas nécessaire de définir des variables-d sur la ligne de commande, pas plus que vous n'avez besoin de définir la variable DISPLAY.

Vous pouvez également exécuter ce code à tout moment. Vous n'avez pas besoin de vous inquiéter de l'invoquer avant que d'autres classes ne soient chargées.

je suppose que ceci pourrait ne pas fonctionner si vous essayez de conduire une interface Swing sur une machine distante à partir d'un environnement sans tête.

3
répondu Carl Sayres 2015-08-28 18:51:24

Vous pouvez définir les JAVA_TOOL_OPTIONS comme ceci:

JAVA_TOOL_OPTIONS: - Djava.awt.headless=true

alors tout nouveau processus utilisera ce paramètre pendant la session. Vous pouvez l'ajouter à votre .bashrc ou .bash_profile (ou n'importe quel fichier de démarrage de shell) pour toutes les sessions suivantes.

Vous pouvez également l'ajouter à la première ligne d'un script groovy comme ceci:

cat hello.groovy
#!/usr/bin/env groovy -Djava.awt.headless=true
println hello
-1
répondu Mike Kinney 2015-12-13 07:28:47