前回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そうです。