CLOVER🍀

That was when it all began.

xsbt-web-pluginを使って、WARファイルを作る

前回sbtでサーブレットプログラミングにトライしたのですが、ちょっと不足がありました…。

それはズバリ…package。

> package
[info] Updating...
[info] Done updating.
[info] Compiling 1 Scala source to /xxxxx/hello-servlet/target/scala-2.9.0.final/classes...
[info] Packaging /xxxxx/hello-servlet/target/scala-2.9.0.final/hello-servlet_2.9.0-1.0.0.jar ...
[info] Done packaging.
[success] Total time: 10 s, completed Jul 17, 2011 5:33:09 PM

…

[info] Packaging /xxxxx/hello-servlet/target/scala-2.9.0.final/hello-servlet_2.9.0-1.0.0.jar ...

…

$ jar -tvf hello-servlet_2.9.0-1.0.0.jar 
    25 Sun Jul 17 17:33:08 JST 2011 META-INF/MANIFEST.MF
     0 Sun Jul 17 17:33:08 JST 2011 littlewings/
     0 Sun Jul 17 17:33:08 JST 2011 littlewings/hello/
     0 Sun Jul 17 17:33:08 JST 2011 littlewings/hello/servlet/
  1246 Sun Jul 17 17:33:08 JST 2011 littlewings/hello/servlet/HelloServlet.class

JARじゃないか…。WARにならないとダメでしょう、コレは。しかもバージョンまで入ってますからねぇ、どしたらいいんでしょ?

と、ちょっとコマンド補完を試してみると…

> package
package-configuration   package-doc             package-options
package-src             package-war             packaged-artifact
packaged-artifacts

「package-war」なるものがおります。こいつを使えばいいのでしょうか?

> package-war
[info] Updating...
[info] Done updating.
[info] Compiling 1 Scala source to /xxxxx/hello-servlet/target/scala-2.9.0.final/classes...
[info] Packaging /xxxxx/hello-servlet/target/scala-2.9.0.final/Hello Servlet_2.9.0-1.0.0.war ...
[info] Done packaging.
[success] Total time: 4 s, completed Jul 17, 2011 5:52:33 PM

おお、なんかWARができています!が、名前がちょっと微妙ですね。Mavenでいう「finalName」的なことをしてあげないといけなさそうな感じ。そして、プロジェクト名がちょっとスペース入りになっているので、変えてあげないと…。

んで、ちょっと調べてみました。
https://github.com/harrah/xsbt/wiki/Artifacts

これを見ると

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

これを設定すれば、なんとかなりそうですね!

というわけで、build.sbtを以下のように修正。

name := "hello-servlet"

version := "1.0.0"

scalaVersion := "2.9.0"

organization := "littlewings"

seq(webSettings: _*)

libraryDependencies ++= Seq(
  "javax.servlet" % "servlet-api" % "2.5" % "provided",
  "org.eclipse.jetty" % "jetty-webapp" % "8.0.0.M3" % "jetty"
)

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

しれっとnameを変えて、それからJettyのバージョンを8まで上げています…。Artifactの名前には、バージョンを含めないようにしました。

では、試してみましょう。

> reload
[info] Set current project to default (in build file:/xxxxx/hello-servlet/project/plugins/)
[info] Set current project to default (in build file:/xxxxx/hello-servlet/)
> package-war
[info] Updating...
[info] Done updating.
[info] Compiling 1 Scala source to /xxxxx/hello-servlet/target/scala-2.9.0.final/classes...
[info] Packaging /xxxxx/hello-servlet/target/scala-2.9.0.final/hello-servlet.war ...
[info] Done packaging.
[success] Total time: 3 s, completed Jul 17, 2011 6:04:02 PM

期待通りの名前になりましたね!

$ jar -tfv hello-servlet.war 
    25 Sun Jul 17 18:04:00 JST 2011 META-INF/MANIFEST.MF
     0 Sun Jul 17 18:04:00 JST 2011 WEB-INF/
     0 Sun Jul 17 18:04:00 JST 2011 WEB-INF/classes/
     0 Sun Jul 17 18:04:00 JST 2011 WEB-INF/classes/littlewings/
     0 Sun Jul 17 18:04:00 JST 2011 WEB-INF/classes/littlewings/hello/
     0 Sun Jul 17 18:04:00 JST 2011 WEB-INF/classes/littlewings/hello/servlet/
     0 Sun Jul 17 18:04:00 JST 2011 WEB-INF/lib/
8861457 Sun Jul 17 18:04:00 JST 2011 WEB-INF/lib/scala-library.jar
   632 Sun Jul 17 18:04:00 JST 2011 WEB-INF/web.xml
  1246 Sun Jul 17 18:04:00 JST 2011 WEB-INF/classes/littlewings/hello/servlet/HelloServlet.class

中身もOKそうです。