JFreeChart Offscreen Imaging

JBoss上でサーブレット(JFreeChart使用)でチャートを生成していて起こったエラー。
サーバ(RedHat9)にグラフィカルログインしてJBossを起動した場合にはチャートを生成できるが、コンソールログインして起動した場合にチャート生成ができない。
で、こんなエラーが出る。


org.apache.jasper.JasperException: Can't connect to X11 window server using ':0.0' as the value of the DISPLAY variable.
調べてみると、JFreeChartは内部でAWTを使用していてXを起動しないとチャート生成を行えないらしい。Xを起動しなくても、JFreeChartでチャートを生成する方法はないか?
調べたら、JFreeChartのフォーラムに解答があった。

Under JRE 1.4, setting the "headless" property to true allows JFreeChart to render in the absence of an X11 instance. Ray Mercer reports success on RedHat Linux 7.1, 7.1j & 7.2. I have verified correct operation on Solaris 2.7.20:
System.setProperty("java.awt.headless","true");
For servlets, you can use set the property in the command line that invokes the servlet container:
java -Djava.awt.headless=true ...
In tomcat 4, the catalina.sh script can use an environment setting:
setenv CATALINA_OPTS -Djava.awt.headless=true
これを参考に、JBossの起動シェル(run.sh)に「java -Djava.awt.headless=true」を追加して起動したら、コンソールログイン時でも無事チャート生成できた。

#ヘッドレス機能については、商用ツールJBarCodeのサイトにも説明があった。


ヘッドレス機能 (トップ)
「ヘッドレス機能」とは、表示デバイスや入力デバイスなどの周辺機器なしで、コンポーネントが自分自身をレンダリングする機能です。つまり、コンポーネントは、画面に自分自身を描画しなくても目的のイメージを生成でき、レンダリングシステムも必要ありません。
本トライアル版 は内部でawtやswingのクラスを使用しています。Unix環境で、アプリケーションがX Window システムに接続できない状態では、これらのクラスを使用するとエラーや例外が発生して正常に動作しません。このような場合、以下のいずれかの「ヘッドレス機能」を利用してください。

JDKJRE 1.4以上のヘッドレス機能
JDKJRE 1.4以上 は、ヘッドレス機能を標準で備えています。
この機能を使用する場合は、次のオプションを使って JVM を実行する必要があります。
-Djava.awt.headless=true

解決方法として、他にPJA Toolkitを使う方法や、Xvfb(X Virtual Frame Buffer)を使う方法があるとのこと。