読者です 読者をやめる 読者になる 読者になる

すずけんメモ

技術メモです

sbtでJettyを立ち上げる

scala sbt Jetty

sbtでJettyを動かしたのでメモ。Jetty自体もMavenではなくsbtでいれるようにする。以下のプラグインを使う。

JamesEarlDouglas/xsbt-web-plugin https://github.com/JamesEarlDouglas/xsbt-web-plugin

このプラグインを利用したサンプルアプリケーションがあるので、これを参照しつつ設定する。

JamesEarlDouglas/xwp-template https://github.com/JamesEarlDouglas/xwp-template

今回の環境は以下のとおり。

  • OSX Mountain Lion 10.8.4
  • Scala 2.10.2
  • sbt 0.12.4

まずはプロジェクトのbuild.sbt

name := "jetty-servlet-scala"

version := "0.0.1"

scalaVersion := "2.10.2"

seq(webSettings :_*)

libraryDependencies += "org.mortbay.jetty" % "jetty" % "6.1.22" % "container"

libraryDependencies += "javax.servlet" % "servlet-api" % "2.5" % "provided"

project/plugins.sbtには追加するsbtのプラグインを記述。上述のgithubリポジトリのもの。

addSbtPlugin("com.earldouglas" % "xsbt-web-plugin" % "0.3.0")

project/build.propertiesにはsbtバージョンを書いておく。

sbt.version=0.12.4

あとはServlet本体のコードを配置していく。以下の様な階層を作る。

▾ src/
  ▾ main/
    ▾ scala/
        HelloServlet.scala
    ▾ webapp/
      ▾ WEB-INF/
          web.xml

HelloServlet.scalaは以下のようにした。

package hoge.test

import scala.xml.NodeSeq
import javax.servlet.http.HttpServlet
import javax.servlet.http.HttpServletRequest
import javax.servlet.http.HttpServletResponse

class HelloServlet extends HttpServlet {
  override def doGet(req: HttpServletRequest, res: HttpServletResponse) {
    res.setContentType("text/html")
    res.setCharacterEncoding("UTF-8")

    val body: NodeSeq = <html><body><h1>hello</h1></body></html>
    res.getWriter.write(body.toString)
  }
}

web.xmlには対応するServletを記述する。

<?xml version="1.0" encoding="UTF-8"?>
<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>hello servlet</servlet-name>
    <servlet-class>hoge.test.HelloServlet</servlet-class>
  </servlet>

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

</web-app>

あとはsbtコンソールに入るとプラグインのインストールやら、Jettyのjarの配置などが始まる。ビルドが完了したら、sbtコンソールでcontainer:startとする。

> container:start
2013-08-01 19:19:36.708:INFO::Logging to STDERR via org.mortbay.log.StdErrLog
[info] jetty-6.1.22
[info] NO JSP Support for /, did not find org.apache.jasper.servlet.JspServlet
[info] Started SelectChannelConnector@0.0.0.0:8080
[success] Total time: 1 s, completed 2013/08/01 19:19:37

これでhttp://localhost:8080にアクセスできるようになる。

このsbtコンソールでのcontainer自体は https://github.com/JamesEarlDouglas/xsbt-web-plugin/blob/master/src/main/scala/Container.scala で実装されている。Containerに名前を渡す(今回はcontainer:startなのでstart)と、containerSettingsSeqに設定されている各オブジェクトにマッチするようになっている。startだとoptionでスタート時の設定が可能となっている。stateは暗黙の型変換によってRunnerが呼ばれるようになっている。今回はJetty6で動かしたので、https://github.com/JamesEarlDouglas/xsbt-web-plugin/blob/master/src/main/scala/Jetty6Runner.scala が呼び出されている。実際のstarthttps://github.com/JamesEarlDouglas/xsbt-web-plugin/blob/master/src/main/scala/Jetty6Runner.scala#L79-L101 で実装されている。