Scala で Google App Engine

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

準備

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

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

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

サーブレット

準備ができたら,あとは,JavaServletクラスを継承して,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プラグインが使えるので,効率的に開発できそう.