Google App EngineでCompojure

ここ最近、Google App Engine(GAE)でCompojureのアプリを動かそうと試みていましたが、デプロイしたURLにアクセスすると

Error: Server Error

The server encountered an error and could not complete your request.
If the problem persists, please report your problem and mention this error message and the query that caused it.

と出てしまいました。管理画面でログを確認すると、

Caused by: java.security.AccessControlException: access denied (java.lang.RuntimePermission getClassLoader)

と、どうやらクラスローダーでひっかかっているようです。

色々と試行錯誤した結果動くようになりましたが、結局Google App EngineでCompojureアプリを動かすポイントは以下の2点でした。

  • Compojureのソースから、compojure.http.multipartを呼んでいるところを探し、コメントアウトします。

ちなみに、対象ソースはcompojure.cljとhttp.cljの2ファイルでした。これをantでビルドし出来上がったcompojure.jarをWEB-INF/libに配置します。これは、GAEのクラスローダによる制約で、ファイルアップロード時にローカルファイルにアクセスしようとするクラスをロードできないための対策です。

  • コンパイルしたクラスをWEB-INF/classesに置かず、jarに固めてWEB-INF/libに配置します。

これで、NetBeans + enclojure + Compojure + GAE の開発環境が構築できました。