# java.awt.HeadlessException trotz -Djava.awt.headless=true



## Herr_M (14. Oktober 2010)

Hi ich versuche gerade unter Linux ein von mir geschriebenes Java Programm zu starten.
Da auf dem Server auf dem es laufen soll kein X11 installiert ist, muss es Headless laufen.


```
java -Djava.awt.headless=true -jar programm.jar
```

Ich erhalta aber trotzdem folgende Exception:


```
java.awt.HeadlessException
        at java.awt.GraphicsEnvironment.checkHeadless(GraphicsEnvironment.java:159)
        at java.awt.Window.<init>(Window.java:431)
        at java.awt.Frame.<init>(Frame.java:403)
        at javax.swing.JFrame.<init>(JFrame.java:207)
        at org.apache.log4j.lf5.viewer.LogBrokerMonitor.initComponents(LogBrokerMonitor.java:486)
        at org.apache.log4j.lf5.viewer.LogBrokerMonitor.<init>(LogBrokerMonitor.java:132)
        at org.apache.log4j.lf5.LF5Appender.getDefaultInstance(LF5Appender.java:208)
        at org.apache.log4j.lf5.LF5Appender.<init>(LF5Appender.java:69)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
        at java.lang.Class.newInstance0(Class.java:355)
        at java.lang.Class.newInstance(Class.java:308)
        at org.apache.log4j.helpers.OptionConverter.instantiateByClassName(OptionConverter.java:330)
        at org.apache.log4j.helpers.OptionConverter.instantiateByKey(OptionConverter.java:121)
        at org.apache.log4j.PropertyConfigurator.parseAppender(PropertyConfigurator.java:664)
        at org.apache.log4j.PropertyConfigurator.parseCategory(PropertyConfigurator.java:647)
        at org.apache.log4j.PropertyConfigurator.configureRootCategory(PropertyConfigurator.java:544)
        at org.apache.log4j.PropertyConfigurator.doConfigure(PropertyConfigurator.java:440)
        at org.apache.log4j.PropertyConfigurator.doConfigure(PropertyConfigurator.java:476)
        at org.apache.log4j.helpers.OptionConverter.selectAndConfigure(OptionConverter.java:471)
        at org.apache.log4j.LogManager.<clinit>(LogManager.java:125)
        at org.apache.log4j.Logger.getLogger(Logger.java:105)
        at de.avs.marktjagd.client.Client.main(Unknown Source)
```

Hat jemand ne Idee woran das liegen könne?


----------



## Thomas Darimont (14. Oktober 2010)

Hallo,

beinhaltet dein Programm neben der Oberfläche auch noch Dienste die auf dem Server gestartet werden sollen?

In diesem Fall solltest du einfach prüfen ob du dich in einer Headless-Umgebung befindest und dann dementsprechend keine UI-Komponenten verwenden die eine Headless-Umgebung (unter Linux -> Eine Umgebung ohne gesetztes Display, bzw. ohne X-Server).

-> GraphicsEnvironment.isHeadless() bzw.
    GraphicsEnvironment.getLocalGraphicsEnvironment().isHeadlessInstance()



Falls das nicht möglich sein sollte kannst du auch den Xvfb verwenden:
http://stackoverflow.com/questions/494442/fake-x11-display

Gruß Tom


----------



## Herr_M (14. Oktober 2010)

Hallo Thomas,

Vielen Dank für die vielen Tips, hab das Problem inzwischen selbst lösen können, bei der "rießen" Stacktrace hatte ich es ganz versäumt mir die Zeile vorher nochmal genauer anzusehen, 
Diese hatte mir nämlich offenbart, dass Log4J "org.apache.log4j.lf5.LF5Appender" diesen Appender nicht finden kann, den ich lokal in meiner Entwicklungsumgebung verwende... diesen zu verwenden macht natürlich auf einem Server (noch dazu ohne grafische Oberfläche) keinen Sinn...

Hab jetzt stattdessen einen FileAppender genommen org.apache.log4j.RollingFileAppender
macht ja auch mehr Sinn...

Die Stacktrace war also vollkommen irreführend... zumindest ab der zweiten Zeile, dummerweise hab ich die dann auch noch nur ab dieser Zeile kopiert 

Das kommt halt davon wenn man mal schnell schnell machen will


----------

