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ファイルが出来上がる.