DotCloudでScala+Scalatraを動かす

DotCloudのアカウントを放ったらかしていたのだけれど、
ベータから移行するときにちょっとよいアカウントをもらえた気がしたので使ってみました。
ScalaとそのフレームワークScalatraを動かします。


まず何はともあれいつもの構成を作りましょう。
sbtで適当にプロジェクトを作りました。


次はScalatraを使うためのプロジェクト設定です。

project/build/MyProject.scala

を作成して下記の内容を記述します。

import sbt._

class MyProject(info: ProjectInfo) extends DefaultWebProject(info) {

  override def webappClasspath = super.webappClasspath +++ buildCompilerJar

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

  val scalatraVersion = "2.0.0-SNAPSHOT"
  val scalateVersion = "1.6.0-SNAPSHOT"

  val scalatra = "org.scalatra" %% "scalatra" % scalatraVersion
  val scalatraScalate = "org.scalatra" %% "scalatra-scalate" % scalatraVersion
  val scalate = "org.fusesource.scalate" % "scalate-core" % scalateVersion

  //リポジトリ
  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"
}

これでScalatraが使えるようになります。


web.xmlが必要なため下記内容で作成しました。

<web-app xmlns="http://java.sun.com/xml/ns/javaee"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5"> 

  <servlet>
    <servlet-name>Main</servlet-name>
    <servlet-class>com.nishikawasasaki.Main</servlet-class>
  </servlet>

  <servlet-mapping>
    <servlet-name>Main</servlet-name>
    <url-pattern>/*</url-pattern>
  </servlet-mapping>

</web-app>

Mainで定義しているScalatraの処理にいくようにしています。


上のxmlで指定したcom.nishikawasasaki.Mainを下記内容で
src/main/scala/Main.scalaとして作成します。

package com.nishikawasasaki

import org.scalatra.ScalatraServlet
import org.scalatra.scalate.ScalateSupport


class Main extends ScalatraServlet with ScalateSupport {

  beforeAll {
    contentType = "text/html"
  }

  get( "/" ) {
    "test"

  }

}

"/"にアクセスすると画面にtext/htmlで"test"と返すシンプルな処理です。


sbtで"package-all"などしてwarを作成しておいてください。


これでひとまず通常のScalatraアプリの作成が完了しました。
# 実際開発するならjettyを使えるようにしておかないと不便ですけれど省いています


さてDotCloudにアップロードするにあたってまず

dotcloud create helloworldapp

を実行してアプリをDotCloudへ登録します。


つぎにこのDotCloudアプリを定義するためにdotcloud.ymlを作成します。
後で必要な場所にコピーして使うので作成する場所はどこでもいいです。

www:
  type: java

言うまでもなくScalaですがJavaで動かせます。


さてデプロイします。
どこでもよいので空のディレクトリを作成しwarをそこにコピーしてきます。
コピーしたwarはDotCloud指定の”root.war”に名前を変更します。
たとえばsbt管理ルート(projectやtargetディレクトリと同階層に)、
”deploy”ディレクトリを作成し、
その中にwarのコピーを入れてroot.warにリネームしました。

/
 - project
 - target
 - deploy
          - root.war

上のような構成です。(だいぶ適当に省いてます・・・)


つぎにdeployディレクトリに先ほど作成したdotcloud.ymlもコピーします。

/
 - deploy
           - root.war
           - dotcloud.war


これで準備は整ったので
deployディレクトリ内で

dotcloud push helloworldapp

を実行してやるとwarがデプロイされ最後にURLが表示されますので
ブラウザでURLにアクセスすると

test

とScalatraに書いた処理の通り実行されているはずです。


ポイントは

  • dotcloud.ymlを手動できちんと作ってやること
  • dotcloud push するときはディレクトリ内にwarとyml以外置かない

の2点だと思います。


また、warのリネームとか面倒だよ!という方は
ScalaをDotCloudにアップロードするためのsbtサンプル | ReSTARTR」
http://goo.gl/kJLf0
にsbtの便利なサンプルを公開されている方がいらっしゃるので参考にしていただければ
sbt上で

  • DotCloudプロジェクトを作成
  • デプロイ用のroot.warの作成
  • デプロイ

を行うことができます。すてきです。


あとはScalatraやScalateを使って好きなものを書けばいろいろできるんじゃないでしょうか・・・