Scala
Building a war with spray-servlet
We will use spray-servlet to build a war file of our API. So we can run it in a java app server. I assume we already have a working REST API. We will need a web.xml, under src/main/webapp/WEB-INF/:
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 | <? xml version = "1.0" ?> < web-app > < listener > < listener-class >spray.servlet.Initializer</ listener-class > </ listener > < servlet > < servlet-name >SprayConnectorServlet</ servlet-name > < servlet-class >spray.servlet.Servlet30ConnectorServlet</ servlet-class > < async-supported >true</ async-supported > </ servlet > < servlet-mapping > < servlet-name >SprayConnectorServlet</ servlet-name > < url-pattern >/*</ url-pattern > </ servlet-mapping > </ web-app > |
We need an sbt plugin to build wars. Add this to project/plugins.sbt:
1 | addSbtPlugin( "com.earldouglas" % "xsbt-web-plugin" % "1.0.0" ) |
We’ll add dependencies to build.sbt, and also extra tasks:
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | name := "exampleAPI" version := "1.0" scalaVersion := "2.11.2" libraryDependencies ++= { val akkaVersion = "2.3.6" val sprayVersion = "1.3.2" Seq( "io.spray" %% "spray-can" % sprayVersion, "io.spray" %% "spray-servlet" % sprayVersion, //We need spray-servlet "io.spray" %% "spray-routing" % sprayVersion, "io.spray" %% "spray-json" % "1.3.1" , "io.spray" %% "spray-testkit" % sprayVersion % "test" , "org.scalatest" %% "scalatest" % "2.2.4" % "test" , "com.typesafe.akka" %% "akka-actor" % akkaVersion, "com.typesafe.akka" %% "akka-testkit" % akkaVersion % "test" , "com.typesafe.akka" %% "akka-slf4j" % akkaVersion, "ch.qos.logback" % "logback-classic" % "1.1.2" ) } //This adds tomcat dependencies, you can also use jetty() tomcat() |
We’ll need to extend spray.servlet.WebBoot:
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 | import akka.actor.{Props, ActorSystem} import spray.servlet.WebBoot // this class is instantiated by the servlet initializer // it needs to have a default constructor and implement // the spray.servlet.WebBoot trait class Boot extends WebBoot { //we need an ActorSystem to host our application in implicit val system = ActorSystem( "SprayApiApp" ) //create apiActor val apiActor = system.actorOf(Props[ApiActor], "apiActor" ) // the service actor replies to incoming HttpRequests val serviceActor = apiActor } |
And add a reference to this class in application.conf:
1 2 3 | spray.servlet { boot- class = “Boot” } |
Now we can run sbt package
to build a war. And in sbt, use container:start
to start a tomcat server with our application. And container:stop
to stop it.
A good way to restart the server every time we change code is:
1 | ~container:start |
Reference: | Building a war with spray-servlet from our JCG partner Tammo Sminia at the JDriven blog. |