Servlet日記(2001/08/26)

本日の成果

 Open Design 2001年9月号のServlet&JSP特集で、画像の動的な生成ができないという報告を江口さんより頂きました(ずいぶん前に ^^;)。調べてみると、Xがインストールされていないサーバなどで起こる現象のようで、FAQに載るような内容ですね。ず〜っとXの上で開発してきたので、気づきませんでした。不勉強ですみません。Linux Log (2001/08/18) Turbo Linux Server 6.5のインストールで用意した環境などで実際に試してみると、起こるエラーはこんなの。

Error: 500
Location: /od/servlet/od.AnalogClock
Internal Servlet Error:

java.lang.InternalError: Can't connect to X11 window server using ':0.0' as the value of the DISPLAY variable.
        at sun.awt.X11GraphicsEnvironment.initDisplay(Native Method)
        at sun.awt.X11GraphicsEnvironment.(X11GraphicsEnvironment.java:58)
        at java.lang.Class.forName0(Native Method)
        at java.lang.Class.forName(Class.java:120)
        at java.awt.GraphicsEnvironment.getLocalGraphicsEnvironment(GraphicsEnvironment.java:58)
        at java.awt.image.BufferedImage.createGraphics(BufferedImage.java:1011)
        at od.AnalogClock.doGet(AnalogClock.java:24)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:740)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
        at org.apache.tomcat.core.ServletWrapper.doService(ServletWrapper.java:404)
        at org.apache.tomcat.core.Handler.service(Handler.java:286)
        at org.apache.tomcat.core.ServletWrapper.service(ServletWrapper.java:372)
        at org.apache.tomcat.core.ContextManager.internalService(ContextManager.java:797)
        at org.apache.tomcat.core.ContextManager.service(ContextManager.java:743)
        at org.apache.tomcat.service.http.HttpConnectionHandler.processConnection(HttpConnectionHandler.java:210)
        at org.apache.tomcat.service.TcpWorkerThread.runIt(PoolTcpEndpoint.java:416)
        at org.apache.tomcat.util.ThreadPool$ControlRunnable.run(ThreadPool.java:498)
        at java.lang.Thread.run(Thread.java:484)

 江口さんはXvfb(仮想フレームバッファ版X)を使って解決されたそうですが、ここでは別の方法として、eTeksというところで公開されている、PJA(Pure Java AWT)を使ってみます。

 AWTは実行環境のウィンドウシステムに依存しているので、ウィンドウシステムがない環境でAWTを使おうとすると問題が起こるようです。それを解決するには、Xvfbなどを使ってウィンドウシステムを用意するか、PJAのようにウィンドウシステムに依存しないAWT(互換ライブラリ)を使うかでしょう。

 PJAの使い方は簡単で、tomcat.shでjavaコマンドの引数に以下を追加しました。

-Xbootclasspath/a:インストールしたパス/pja.jar
-Dawt.toolkit=com.eteks.awt.PJAToolkit
-Djava.awt.graphicsenv=com.eteks.java2d.PJAGraphicsEnvironment

 これでTomcatを起動し直してみると、プログラムに手を加えなくても動作しました。が、フォント関係のエラーが起こっているなあ。

本日の教訓

 知らないことがいろいろありますね(当たり前ですが)

Servlet日記の目次 ホーム