公開サーバが欲しいって話を一昨日書いたら知人から Google App Engine はどうよ、ってメールが来た。

で、ちょっと調べてみた。
制限は有る物の普通の Servletサーバ±α って感じの物らしい。
ローカルで実行できる環境も用意されている。

じゃあやって見るかと言うことでダウンロード。
http://code.google.com/intl/ja/appengine/downloads.html#Google_App_Engine_SDK_for_Java

展開して取り合えずデモを実行してみる。

> bin/dev_appserver.sh demos/guestbook/war
http://localhost:8080/ にアクセスすると何かそれっぽい物が動いている。
サーバは jetty ベースのようなので普通にServletが動きそう。

と言うわけで WSJSを乗せて見ることにした。
グーグルのチュートリアルを見ながら進めて行くとまず、設定ファイルが2つ必要らしい。
- web.xml : 普通の web.xml。
- appengine-web.xml : GAE 専用、内容はこれだけで良い。

取り合えずこれで実行... 怒られた。
2009/11/28 11:34:39 com.google.apphosting.utils.jetty.JettyLogger warn
: Error starting handlers
java.lang.NoClassDefFoundError: java.lang.management.ManagementFactory is a restricted class. Please see the Google  App Engine developer's guide for more details.
        at com.google.appengine.tools.development.agent.runtime.Runtime.reject(Runtime.java:51)
        at kotemaru.util.CPUMonitor.(CPUMonitor.java:11)
        at kotemaru.wsjs.WsjsServlet.localInit(WsjsServlet.java:36)
        at kotemaru.wsjs.WsjsServlet.init(WsjsServlet.java:22)
ここで何をやっているかと言うと com.sun.management.OperatingSystemMXBean のインスタンスを生成している。 com.sun.* は制限っぽい。まあ、しょうがないだろう。
CPUMonitorは無くても良いのでコメントアウトして再起動。

起動はしたがアクセスしたら、怒られた。

java.security.AccessControlException: access denied (java.io.FilePermission /home/inou/wsjs/webapps/wsjs/.link read)
        at java.security.AccessControlContext.checkPermission(AccessControlContext.java:323)
        at java.security.AccessController.checkPermission(AccessController.java:546)
        at java.lang.SecurityManager.checkPermission(SecurityManager.java:532)
んー、この辺は予想通り。
webapps/ を WEB-INF/docroot/ に移動して再起動。

また、怒られた。

java.lang.RuntimeException: Session support is not enabled in appengine-web.xml. To enable sessions, put true in that file. Without it, getSession() is allowed, but manipulation of sessionattributes is not.
言われるがままに設定追加して再起動。

今度はトップページが出た。思ったより順調
でもJSCPやEXJSは動かない。
この辺を読むと静的ページはサーブレットを通さないとか書いてある。
http://code.google.com/intl/ja/appengine/docs/java/gettingstarted/staticfiles.html
全部のページを WEB-INF/docroot/ に置くようにしてみた。

JSCPは動いたがEXJSにアクセスするとエラー。

エラー:  'Could not initialize class com.sun.org.apache.bcel.internal.util.SyntheticRepository'
致命的エラー:  'スタイルシートをコンパイルできませんでした'
javax.xml.transform.TransformerConfigurationException: スタイルシートをコンパイルできませんでした
        at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl.newTemplates(TransformerFactoryImpl.java:825)
        at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl.newTransformer(TransformerFactoryImpl.java:614)
標準のXSLTが制限クラスを使っているらしい。
ちょっとググったら出て来た。
http://d.hatena.ne.jp/bluerabbit/20090925/1253884096
apache.org から落して来た XSLT の jar を lib に入れるだけ。
で、再起動。

EXJSも動いた。

WSJSとして最低限の機能は動作したがさすがにDBとファイルへの書き込みは逃げようが無い。 ストレージとして JDO と言う機能が提供されているのでこれに乗り換えるしか無さそう。 そんなに難しくはなさそうなのでサポートはしようと思う。

しかし公開サーバと言う意味では GAE はちょっと窮屈な感じが否めない。
やっぱり何でもできる自前のサーバが欲しい..