Scala で Google App Engine

Scalaのプログラムは,かなりそのままJavaのクラスファイルとなるので,Google App EngineのサーブレットをScalaで書けるんじゃないかと思っていたが,やってみたら,すごく簡単に書けた.
方法は,こちらのサイトを参考.Eclipseのプラグインを使う.

準備

下記の手順で環境をセットアップする.

  • Google App Engine のプラグインをEclipseに導入する.
  • ScalaのプラグインをEclipseに導入する.方法は,こちら.
  • App Engineのプロジェクトを作成する.
  • パッケージエクスプローラのプロジェクト名上で,右クリックでコンテクストメニューを出し,Scala-> Add Scala Natureを選択.これによって,作成したプロジェクトでScalaが使えるようになる.

ここまでで,App Engine開発サーバでScalaが実行できるようになる.が,クラウドにデプロイしてもScalaのライブラリがクラウドにコピーされないため動作しない.ライブラリがコピーされるようにするには,下記が必要.

  • Scalaのライブラリjarã‚’ war/WEB-INF/lib にコピー(後述)

サーブレット

準備ができたら,あとは,JavaのServletクラスを継承して,Scalaでサーブレットを書いてやればよい.このとき,右クリック,new->class ではなく,new -> other で出てくるウィザードのなかから,Scala classを選択すれば,Scalaのクラスを作成できる.

import java.io.IOException
import javax.servlet.http._
  
class HelloServlet extends HttpServlet {
  override def doGet(req: HttpServletRequest, 
                     resp: HttpServletResponse) {
    resp.setContentType("text/plain")
    resp.getWriter().println("Hello world, from Scala!")       
  }
}

簡単だ.この例だと簡単すぎて,Scalaで書く意味がない:).

あとは,特に何もする必要は無く,普通に開発サーバを使うことができる.

ライブラリのコピー

前述したように,war/WEB-INF/lib 以下にScalaのライブラリjarをコピーする必要がある.どこから持ってきてもよいと思うが,pluginに含まれているjarのパスが,パッケージエクスプローラのScala Library の下に見えているので,それをコピーする.私のMac OSでの環境の場合は,こんな感じ.

> cp /Applications/eclipse/configuration/org.eclipse.osgi\
/bundles/354/1/.cp/lib/scala-{dbc,library,swing}.jar \
workspace/scalagae/war/WEB-INF/lib 

これで,クラウドにデプロイして実行することができた.

問題点

問題は,データストア.普通Google App Engineでは,JDO(かJPA)を使って,データストアにアクセスするのだけど,JDOではアノテーションを使う.Scalaでもアノテーションは使えるはずなので,ちゃんと書けば使えそうだけどまだ成功していない.もちろん,データの宣言はJavaでやっておいて,Scalaからは使うだけ,という方法は簡単にできそうだ.

所感

意外に簡単だった.Eclipseプラグインが使えるので,効率的に開発できそう.