Scalatra on Google App Engine

Scalatra

Scalatraという、Rubyで言うところのSinatraにinspireされた軽量Webフレームワークがありまして。

それをGoogle App Engineに乗っけてみようと思い立ちましたとさ。

ググったらまずこちらがヒット。
Google グループ


上記リンクからこちらへ。
scala - How to use sbt with Google App Engine? - Stack Overflow

でこちらに。
HelloworldProject.scala · GitHub

Scalatra設定はこちらを参考。
ScalatraによるWebアプリケーション作成 - sbtを使った開発 - なんとなくな Developer のメモ


sbt環境の準備ができている前提で進めます。

sbtで雛形作製

mkdir helloworld
cd helloworld
sbt

内容を適当に入力。
scalaは2.8.0としておきます。

Plugin

{root}/project/plugins/Plugins.scala

を作成し、下記を入力。

import sbt._

class Plugins(info: ProjectInfo) extends PluginDefinition(info) {
    val appenginePlugin = "net.stbbs.yasushi" % "sbt-appengine-plugin" % "2.0" from "http://github.com/downloads/Yasushi/sbt-appengine-plugin/sbt-appengine-plugin-2.0.jar"
}

Project

{root}/project/build/HelloworldProject.scala

を作成し、下記を入力。

import sbt._

class HelloworldProject(info: ProjectInfo) extends AppengineProject(info){
    val scalatraVersion = "2.0.0-SNAPSHOT"
    val scalatra = "org.scalatra" %% "scalatra" % scalatraVersion

    val servletapi = "javax.servlet" % "servlet-api" % "2.5"

    val scalaToolsSnapshots = "Scala Tools Repository" at "http://nexus.scala-tools.org/content/repositories/snapshots/"
    val sonatypeNexusSnapshots = "Sonatype Nexus Snapshots" at "https://oss.sonatype.org/content/repositories/snapshots"
    val sonatypeNexusReleases = "Sonatype Nexus Releases" at "https://oss.sonatype.org/content/repositories/releases"
    val fuseSourceSnapshots = "FuseSource Snapshot Repository" at "http://repo.fusesource.com/nexus/content/repositories/snapshots"

}

web.xml

{root}/src/main/webapp/WEB-INF/web.xml

を作成し、下記を入力。

<?xml version="1.0" ?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee" version="2.5">
  <servlet>
    <servlet-name>helloworld</servlet-name>
    <servlet-class>com.rktm.HelloScalatra</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>helloworld</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>
</web-app>

appengine-web.xml

{root}/src/main/webapp/WEB-INF/appengine-web.xml

を作成し、下記を入力。

<?xml version="1.0"?>
<appengine-web-app xmlns="http://appengine.google.com/ns/1.0">
  <application>yourapplicationname</application>
  <version>1</version>
</appengine-web-app>

scalatra

{root}/src/main/scala/com/rktm/HelloScalatra.scala

を作成し、下記を入力。

package com.rktm
import org.scalatra.ScalatraServlet

class HelloScalatra extends ScalatraServlet {
    get("/") {
        "this is test."
    }

    get("/:foo") {
        val x = params("foo")
        "foo : " + x
    }
}

環境変数

APPENGINE_SDK_HOME

を設定しておきます。

sbtを起動

sbtを起動してupdate。
ごりごりいろんなものを落としてくるはず。

ローカルで確認

sbtにて

dev-appserver-start

でローカルサーバー起動。

http://localhost:8080/
にアクセスすると

this is test.

の文字が表示されます。

http://localhost:8080/xxx
にアクセスすると

foo : xxx

が表示されます。URLのxxxを変えると、表示される文言も変わります。

Google App Engine上にデプロイ

appcfg.sh update {root}/target/scala_2.8.0/webapp/

でGAE/J上にデプロイ。

今後

次はScalateを組み込みたいです。
その次はSlim3のデータストア機能で。