2010-03-31 8 views
30

Ich versuche java.awt.headless=true während des Starts der Anwendung festlegen, aber es scheint, wie ich zu spät bin und die nicht-Headless Mode hat bereits begonnen:Einstellung java.awt.headless = true programmatisch

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

Ist gibt es einen anderen Weg, der neben -Djava.awt.headless=true kopflos zu wahr ist? Ich würde es vorziehen, nichts auf der Konsole zu konfigurieren.

+2

Sie auch in http://en.wikipedia.org/wiki/Xvfb interessiert sein könnten. – lexicore

Antwort

35

Ich war mit einem main() in einer Klasse arbeiten die statisch verschiedenen Teilen JFreeChart in Constants lädt (und andere statischer Code).

Das Verschieben des statischen Ladeblocks an die Spitze der Klasse löste mein Problem.

funktioniert das nicht:

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

Haben java den statischen Block so früh wie möglich auszuführen, indem es an die Spitze der Klasse in Bewegung!

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

Wenn Sie darüber nachdenken, macht das vollkommen Sinn :). Juhu!

+0

Das ist komisch. Was für mich funktionierte, war, 'java.awt.headless' explizit auf' false' zu ​​setzen. – kumetix

+0

Das Setzen der Eigenschaft auf '" true "' im statischen Initialisierungsblock funktionierte einwandfrei. @kumetix hast du vielleicht 'true' anstatt' 'true'' probiert? – Raffael

4

Dies sollte funktionieren, weil der Aufruf von System.setProperty vor der Erstellung des Toolkits ist:

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

An diesem Punkt scheint das Toolkit geladen zu sein, so dass ich diese Eigenschaft nicht mehr ändern kann. Der statische Block {} sollte schon vor dem Hauptblock aufgerufen werden. – reto

3

Ich denke, dass dieser Parameter gesetzt werden kann, indem Sie es als Argument an Java Virtual Machine z.

-Djava.awt.headless=true. Nicht sicher, ob dies Auswirkungen auf andere Komponenten Ihrer Anwendung haben würde.

+1

"Gibt es einen anderen Weg, den headless = true neben -Djava.awt.headless zu setzen? Ich würde es vorziehen, nichts auf der Konsole zu konfigurieren." – reto

3

Hier ist ein ganz anderer Ansatz.

Ich verwende dies erfolgreich, um auf serverseitigen BufferedImages in einer kopflosen Umgebung (Ubuntu) zu zeichnen. Das Schöne daran ist, dass keine -D-Variablen in der Befehlszeile gesetzt werden müssen oder die Variable DISPLAY gesetzt werden muss.

Sie können diesen Code auch jederzeit ausführen. Sie müssen sich keine Gedanken darüber machen, bevor Sie andere Klassen laden.

Ich nehme an, dass dies möglicherweise nicht funktioniert, wenn Sie versuchen, eine Swing-Schnittstelle auf einer Remote-Maschine aus einer kopflosen Umgebung zu fahren.

0

Sie können die JAVA_TOOL_OPTIONS wie folgt festgelegt:

JAVA_TOOL_OPTIONS: -Djava.awt.headless = true

Dann alle neuen Prozesse, die Einstellung während der Sitzung verwendet wird. Sie können es für alle nachfolgenden Sitzungen zu Ihrer .bashrc- oder .bash_profile-Datei (oder der Shell-Startup-Datei) hinzufügen.

Sie können es auch auf die erste Zeile eines groovy Skript wie folgt hinzufügen:

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

Die Frage war, wie man es von INNERHALB der Anwendung einstellt. – reto

Verwandte Themen