メニューを閉じる

テクノデジタルグループ

メニューを開く

2015.10.02

プログラミング

ScalatraをHerokuに公開する

Scalatra

Scalatraとは

Scala + Sinatra (Ruby発のマイクロフレームワーク)

要するに、Scalaで超簡単にWebサービスを作れるフレームワークです。

 

Herokuとは

Gitの操作のみでデプロイが出来るPaaS(Platform as a Service)

要するに、Gitで超簡単にWebサービスを公開できる便利サービスです。

当初はRuby向けとしてローンチされましたが、今ではPHPやNode.js、Scalaまで使うことができます。

基本、無料です。

 

ちなみに

これから紹介する手順は全てMacのためのものです。

もちろんWindowsでもScalaやHerokuを使えますが、手順が異なりますのでご注意をば

 

Heroku準備

まずは、Herokuのアカウント登録をしましょう。(https://www.heroku.com/

Herokuを使うためのツール群(Heroku Toolbelt)をインストールしましょう。(https://toolbelt.heroku.com/

ターミナルから

heroku login

と実行しましょう。

登録したアカウント情報を入力すれば、Herokuを使う準備は完了です。

超簡単ですね。

 

Scala準備

次に、Scalaの準備をしましょう。

Macユーザなら、もちろんHomebrewは導入済みですよね?導入してない方は是非この機会に

さて、Scalaや、その他のライブラリのインストールはHomebrewからコマンド一発で行います。

brew install scala sbt typesafe-activator giter8

以上です。

 

Scalatraプロジェクトの作成

Scalaの準備も出来ましたので、Giter8を利用して、Scalatraプロジェクトを作成しましょう。

ターミナルで適当なディレクトリに移動して

g8 scalatra/scalatra-sbt

とコマンドを叩けばOKです。途中、色々と聞かれるので、必要な情報を入力してください。

例)

g8 scalatra/scalatra-sbt
organization [com.example]: org.kt
name [My Scalatra Web App]: sampleapp
version [0.1.0-SNAPSHOT]:
servlet_name [MyScalatraServlet]: SampleAppServlet
package [com.example.app]: org.kt.sampleapp
scala_version [2.11.6]:
sbt_version [0.13.8]:
scalatra_version [2.4.0-RC2-2]:

Template applied in ./sampleapp

これでScalatraプロジェクトの作成は終わりです。超簡単ですね。

 

sbtでサーバを動かしてみよう

せっかくプロジェクトが出来たので、Herokuに公開する前に、一度動かしてみましょう。

Scalaのプロジェクトを起動するには、SBT(Scala Build Tool)を使用します。

ターミナルから

cd sampleapp
sbt
> container:start

と叩けば、ローカルで起動します。

http://localhost:8080/にアクセスして、Hello Worldと表示されればOKです!
開発環境

これからコードを書いていくために、ここいらで開発環境を準備しましょう。

私はEclipseが苦手なので、Intellij IDEAのCE版をつかいます。

Macなので、Homebrew caskで一発です。

brew cask install intellij-idea-ce

WindowerやHomebrew導入してない人はHPから落としてきてください。

 

次に、ScalatraのプロジェクトをIntellij IDEAで開けるようにちょちょっと設定します。

まずは、project/plugins.sbtに下記を追加します。

addSbtPlugin("com.github.mpeltonen" % "sbt-idea" % "1.6.0")

その後、ターミナルから

sbt
> gen-idea

を実行すると、Intellij IDEAに必要なファイルを生成してくれます。

生成が完了したら、Intellij IDEAを起動してImport Projectからプロジェクトを開きましょう。

 

Herokuにデプロイするための準備

ここから、作成したプロジェクトをHerokuにデプロイするための準備をします。

ここまでは超簡単でしたが、ここからは少しむずかしいです。

RubyをデプロイするためのサービスにScalaをデプロイする訳ですから、多少ゴニョゴニョする必要があります。

めんどいのは一度キリなので、我慢して進みましょう。

脅しもこれぐらいにして、早速準備していきましょう。

ちなみに、これから紹介する手順は、Scalatraのページにも書いてます。そちらも参照してみてください。

 

 Step 1 Jetty設定

project/build.scalaを開き、

    "org.eclipse.jetty" % "jetty-webapp" % "9.2.10.v20150310" % "container",

    "org.eclipse.jetty" % "jetty-webapp" % "9.2.10.v20150310" % "compile;container",

に変更しましょう。

 

 Step2 SBT Start Script用プラグインの設定

project/build.sbtを、下記の内容で作りましょう。

addSbtPlugin("com.typesafe.sbt" % "sbt-start-script" % "0.10.0")

続いて、project/build.scalaを開き、

  lazy val project = Project (
    "idealidea",
    file("."),
    settings = ScalatraPlugin.scalatraSettings ++ scalateSettings ++ Seq(

  lazy val project = Project (
    "idealidea",
    file("."),
    settings = seq(com.typesafe.sbt.SbtStartScript.startScriptForClassesSettings: _*) ++ ScalatraPlugin.scalatraSettings ++ scalateSettings ++ Seq(

に変更しましょう。ScalaのSbtを起動するためのスクリプトを読み込む設定を追加してます。

 

 Step3 mainメソッドの作成

HerokuがScalaアプリケーションとして認識するにはmainメソッドが必要になります。

Herokuのために用意してあげましょう。

場所はsrc/main/scala/JettyLauncher.scalaです。

import org.eclipse.jetty.server.Server
import org.eclipse.jetty.servlet.{ DefaultServlet, ServletContextHandler }
import org.eclipse.jetty.webapp.WebAppContext
import org.scalatra.servlet.ScalatraListener
import org.ktada.sampleapp.SampleAppServlet   # ★ 自分で用意したサーブレット名

object JettyLauncher {
  def main(args: Array[String]) {
    val port = if(System.getenv("PORT") != null) System.getenv("PORT").toInt else 8080

    val server = new Server(port)
    val context = new WebAppContext()
    context.setContextPath("/")
    context.setResourceBase("src/main/webapp")

    context.setEventListeners(Array(new ScalatraListener))
    context.addServlet(classOf[SampleAppServlet], "/*");   # ★ 自分で用意したサーブレット名
    context.addServlet(classOf[DefaultServlet], "/");

    server.setHandler(context)

    server.start
    server.join
  }
}

基本は↑をコピペで大丈夫です。★の箇所のみ、自分のアプリ名に応じて変えてください。

そろそろ飽きてきた?もうちょっとだから頑張って。

 

 Step4 JDKバージョンの指定

Herokuでは、デフォルトでJDK1.6を使用するらしい(2015.7.30現在)です。

今回作ったScalatraのプロジェクトを動作させるにはJDK1.7である必要があるので

Herokuに「JDK1.7を使って」って教えてあげましょう。

プロジェクトのトップディレクトリにsystem.propertiesというファイルを作成しましょう。

内容は、下記の通りです。

java.runtime.version=1.7

これで、HerokuでScalatraを動かすための準備は終わりました。いよいよデプロイです。

 

Heroku デプロイ

冒頭でも述べたとおり、HerokuへのデプロイはGitをつかいます。

ターミナルから、プロジェクトのトップディレクトリに移動して

git add .
git commit -m "initial commit"
heroku create --stack cedar
git push heroku master

はい、これでデプロイ完了です。ズラズラーっとメッセージが出ると思います。

もし、途中でエラーになったら、随時修正してください。

多分、途中のどこかの作業が漏れてるか間違ってるかです。

デプロイが完了したら、heroku openとコマンドを叩けば、

ブラウザでデプロイしたアプリを見ることが出来ます。

 

どうです?超簡単でしたか?面倒だって?

いえいえ、上にも書いたとおり、めんどい作業は初回のみです。

次からは修正してgit add/commitしてgit push heroku masterすればデプロイできます。

では、よいScalaライフを。


【記事への感想募集中!】

記事への感想・ご意見がありましたら、ぜひフォームからご投稿ください!
  • こんな記事が読んでみたい、こんなことが知りたい、調べてほしい!という意見も募集中!
  • いただいた感想は今後の記事に活かしたいと思います!

感想フォームはこちら


【テクノデジタルではエンジニア/デザイナーを積極採用中です!】

下記項目に1つでも当てはまる方は是非、詳細ページへ!
  • 自分でアプリを作ってみたい
  • ITで世の中にワクワクを生み出したい
  • 使いやすさ、デザインにこだわったWebサイトを開発したい

採用情報の詳細はこちら


Qangaroo(カンガルー)

  • 徹底した見やすさと優れた操作性で、テストの「見える化」を実現。
  • テストの進捗が見える。開発がスマートに進む。
  • クラウド型テスト管理ツール『Qangaroo(カンガルー)』

【テクノデジタルのインフラサービス】

当社では、多数のサービスの開発実績を活かし、
アプリケーションのパフォーマンスを最大限に引き出すインフラ設計・構築を行います。
AWSなどへのクラウド移行、既存インフラの監視・運用保守も承りますので、ぜひご相談ください。
詳細は下記ページをご覧ください。

https://www.tcdigital.jp/infrastructure/

最近の記事