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/:

<?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:

addSbtPlugin("com.earldouglas" % "xsbt-web-plugin" % "1.0.0")

We’ll add dependencies to build.sbt, and also extra tasks:

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:

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:

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:

~container:start
Reference: Building a war with spray-servlet from our JCG partner Tammo Sminia at the JDriven blog.

Arthur Arts

Arthur Arts is an experienced Enterprise Java software engineer and hands-on Agile Coach and Scrum Master. He has a strong focus on agile engineering principles and practices and loves to share his knowledge and learn from others. He has his own company Coded Value, is a passionate photographer and writes for agilearts.nl.
Subscribe
Notify of
guest

This site uses Akismet to reduce spam. Learn how your comment data is processed.

0 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
Back to top button