xsbt-web-plugin

Build Definitions

0.9.x

project/plugins.sbt:

addSbtPlugin("com.earldouglas" % "xsbt-web-plugin" % "0.9.0")
// for sbt-0.12.x
//addSbtPlugin("com.earldouglas" % "xsbt-web-plugin" % "0.5.0")

0.9.x は sbt-0.13.0 以上が必要です。sbt-0.12.x 系の場合は 0.5.x を利用します。

build.sbt:

seq(webSettings :_*)

libraryDependencies ++= Seq(
  "javax.servlet" % "javax.servlet-api" % "3.0.1" % "provided",
  "org.eclipse.jetty" % "jetty-webapp" % "9.1.0.v20131115" % "container",
  "org.eclipse.jetty" % "jetty-plus"   % "9.1.0.v20131115" % "container",
  //"org.apache.tomcat.embed" % "tomcat-embed-core"         % "7.0.22" % "container",
  //"org.apache.tomcat.embed" % "tomcat-embed-logging-juli" % "7.0.22" % "container",
  //"org.apache.tomcat.embed" % "tomcat-embed-jasper"       % "7.0.22" % "container"
)

host in container.Configuration := "0.0.0.0"

port in container.Configuration := 8080

0.2.x

project/plugins.sbt:

libraryDependencies <+= sbtVersion(v => v match {
  case "0.11.0" => "com.github.siasia" %% "xsbt-web-plugin" % "0.11.0-0.2.8"
  case "0.11.1" => "com.github.siasia" %% "xsbt-web-plugin" % "0.11.1-0.2.10"
  case "0.11.2" => "com.github.siasia" %% "xsbt-web-plugin" % "0.11.2-0.2.11"
  case "0.11.3" => "com.github.siasia" %% "xsbt-web-plugin" % "0.11.3-0.2.11.1"
  case x if (x.startsWith("0.12")) => "com.github.siasia" %% "xsbt-web-plugin" % "0.12.0-0.2.11.1"
})

build.sbt:

seq(webSettings :_*)

libraryDependencies ++= Seq(
  "org.mortbay.jetty" % "jetty" % "6.1.22" % "container",
  "javax.servlet" % "servlet-api" % "2.5" % "provided"
)

Usage

net.example.servlets.SandboxServlet を作成してみます。ソースは src/main/scala/net/example/servlets/SandboxServlet.scala に設置します。

package net.example.servlets

import javax.servlet.http.{HttpServlet, HttpServletRequest, HttpServletResponse}

class SandboxServlet extends HttpServlet {
  override def doGet(request:HttpServletRequest, response:HttpServletResponse) {
    response.setContentType("text/plain")
    response.setCharacterEncoding("UTF-8")
    response.getWriter().write("Hello World")
  }
}

src/main/webpp/WEB-INF/web.xml を配置します。

<web-app>
  <servlet>
    <servlet-name>sandbox</servlet-name>
    <servlet-class>net.example.servlets.SandboxServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>sandbox</servlet-name>
    <url-pattern>/sandbox</url-pattern>
  </servlet-mapping>
</web-app>

sbt コンソールから container:start で Jetty を起動します。

% sbt
[info] Loading project definition from ....
[info] Set current project to sandbox (in build file:...)
> container:start
[info] Compiling 1 Scala source to ...
...: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
....

http://localhost:8080/sandbox にアクセスすると応答が確認できます。

% telnet localhost 8080
Trying ::1...
Connected to localhost.
Escape character is '^]'.
GET /sandbox HTTP/1.1
Host: localhost

HTTP/1.1 200 OK
Content-Type: text/plain; charset=utf-8
....

Hello World

container:reload / でソース変更を反映できます。~ 付きの以下のコマンドではソース更新を検知して自動で反映を行ってくれます。

> ~; container:start; container:reload /

container:stop でサーバを停止します。

> container:stop

package で .war パッケージが target/(パッケージ名).war に作成されます。

> package

生成される .war ファイル名にバージョン情報が付与されるのを回避するには、build.sbt に以下の行を追加して artifactName 値でパッケージ名のフォーマットを変更します。

sbt-0.12.x 系では artifactName の型は (ScalaVersion, ModuleID, Artifact) => String になります。

artifactName := { (config:ScalaVersion, module:ModuleID, artifact:Artifact) =>
  artifact.name + "." + artifact.extension
}

sbt-0.11.x 系では artifactName の型は (String, ModuleID, Artifact) => String になります。

artifactName := { (config:String, module:ModuleID, artifact:Artifact) =>
  artifact.name + "." + artifact.extension
}