水曜日, 8月 08, 2007

simpleCaptcha on Debian etch

Debian etch上でtomcat 5.5を動かして,SimpleCaptchaを使うには工夫が必要.

implementingを見ながら,普通に使うと以下のようなエラーが出る.

java.awt.HeadlessException
sun.java2d.HeadlessGraphicsEnvironment.getDefaultScreenDevice(HeadlessGraphicsEnvironment.java:65)
nl.captcha.text.imp.DefaultWordRenderer.renderWord(Unknown Source)
nl.captcha.servlet.DefaultCaptchaIml.createImage(Unknown Source)
nl.captcha.servlet.CaptchaServlet.doGet(Unknown Source)
javax.servlet.http.HttpServlet.service(HttpServlet.java:689)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)

google等で調べると,tomcatの起動時に,
-Djava.awt.headless=true

と指定すれば解決できると書いてある.

具体的には,Debianでは,
/etc/default/tomcat5.5

を,以下のように編集する
# Arguments to pass to the Java virtual machine (JVM)
# "-Djava.awt.headless=true -Xmx128M" is automatically set if CATALINA_OPTS
# is left empty here
CATALINA_OPTS="-Djava.awt.headless=true -Xmx128M -server"

が,実際はこれだけではうまくいかない.
何故かというと,Debian etchのaptを使ってインストールされるJavaが,やや古いために起こる.
Java 1.4.2では,headless modeでJavaを起動しても,sun.java2d.HeadlessGraphicsEnvironment.getDefaultScreenDevice(...)がheadless exceptionを投げてくるバグがあるのだ.
Running in Headless mode still produces Headless exception with GTK UI

これを回避するために,SimpleCaptchaのコードを少々いじくる.
いじくるファイルは,
$ vi $SimpleCaptchaDir/JavaSource/nl/captcha/text/imp/DefaultWordRenderer.java

で,57-60行目をコメントアウト
 57                 //GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
58
59 //GraphicsDevice gd = ge.getDefaultScreenDevice();
60 //GraphicsConfiguration gc = gd.getDefaultConfiguration();


次に,build.xmlの12行目を正しいj2ee.jarのありかに書き換える.
 vi $SimpleCaptchaDir/build.xml
12 <fileset file="F:\Program Files\IBM\WebSphere Studio\Application Developer\v5.1\runtimes\aes_v4\lib\j2ee.jar"/>

最後に,SimpleCaptchaのトップディレクトリで,antを実行.
$ cd $SimpleCaptchaDir
$ ant

すると,dist以下にそれらしきjarファイルが出来上がる.

0 件のコメント: