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
)と、containerSettings
のSeq
に設定されている各オブジェクトにマッチするようになっている。start
だとoptionでスタート時の設定が可能となっている。state
は暗黙の型変換によってRunner
が呼ばれるようになっている。今回はJetty6で動かしたので、https://github.com/JamesEarlDouglas/xsbt-web-plugin/blob/master/src/main/scala/Jetty6Runner.scala が呼び出されている。実際のstart
は https://github.com/JamesEarlDouglas/xsbt-web-plugin/blob/master/src/main/scala/Jetty6Runner.scala#L79-L101 で実装されている。