2010-03-31 25 views
30

Je suis en train de mettre java.awt.headless=true lors du démarrage de l'application, mais il semble que je suis trop tard et le mode non sans tête a déjà commencé:Réglage java.awt.headless = true programme

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

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

+2

Vous pouvez également être intéressé par http://en.wikipedia.org/wiki/Xvfb. – lexicore

Répondre

35

Je travaillais avec un main() dans une classe qui charge statiquement différentes parties de JFreeChart Constantes (et d'autres code statique).

Le déplacement du 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 est d'exécuter le bloc statique 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() {} 
    } 

Quand on pense à ce sujet cela a un sens parfaitement :). Juhu!

+0

C'est bizarre. ce qui fonctionnait pour moi était de mettre explicitement 'java.awt.headless' à' false' – kumetix

+0

La définition de la propriété '' true ''dans le bloc d'initialisation statique fonctionnait très bien. @kumetix peut-être avez-vous essayé 'true' au lieu de' 'true ''? – Raffael

4

Cela devrait fonctionner parce que 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()); 
} 
+0

À ce stade, la boîte à outils semble être déjà chargée, donc je ne peux plus changer cette propriété. le bloc static {} doit être appelé avant même le bloc principal. – reto

3

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

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

+1

"Y a-t-il un autre moyen de régler headless = true à côté de -Djava.awt.headless? Je préférerais ne rien configurer sur la console." – reto

3

Voici une approche complètement différente. Je l'utilise 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 des variables -D sur la ligne de commande, ni vous avez besoin 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 que les autres classes ne soient chargées. Je suppose que cela pourrait ne pas fonctionner si vous essayiez de piloter une interface Swing sur une machine distante à partir d'un environnement sans tête.

0

Vous pouvez définir les JAVA_TOOL_OPTIONS comme ceci:

JAVA_TOOL_OPTIONS: -Djava.awt.headless = true

Ensuite, tout nouveau processus utilisera ce paramètre au cours de la session. Vous pouvez l'ajouter à votre fichier .bashrc ou .bash_profile (ou à n'importe quel fichier de démarrage du 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 
+0

La question était de savoir comment le définir à partir de l'intérieur de l'application. – reto