0

This is my first time using Scalatra, and I'm using it outside of SBT (building and running using mill). I get the following error which seems to be about a missing dependency.

2018.05.23 18:26:30 [main] INFO org.scalatra.servlet.ScalatraListener - The cycle class name from the config: ScalatraBootstrap
2018.05.23 18:26:30 [main] INFO org.scalatra.servlet.ScalatraListener - Initializing life cycle class: ScalatraBootstrap
2018.05.23 18:26:30 [main] ERROR org.scalatra.servlet.ScalatraListener - Failed to initialize scalatra application at 
java.lang.NoSuchMethodError: javax.servlet.ServletContext.getFilterRegistration(Ljava/lang/String;)Ljavax/servlet/FilterRegistration;
        at org.scalatra.servlet.RichServletContext.mountFilter(RichServletContext.scala:162)
        at org.scalatra.servlet.RichServletContext.mount(RichServletContext.scala:85)
        at org.scalatra.servlet.RichServletContext.mount(RichServletContext.scala:93)
        at org.scalatra.servlet.RichServletContext.mount(RichServletContext.scala:90)
        at ScalatraBootstrap.init(ScalatraBootstrap.scala:8)
        at org.scalatra.servlet.ScalatraListener.configureCycleClass(ScalatraListener.scala:66)
        at org.scalatra.servlet.ScalatraListener.contextInitialized(ScalatraListener.scala:22)
        at org.eclipse.jetty.server.handler.ContextHandler.callContextInitialized(ContextHandler.java:890)
        at org.eclipse.jetty.servlet.ServletContextHandler.callContextInitialized(ServletContextHandler.java:558)
        at org.eclipse.jetty.server.handler.ContextHandler.startContext(ContextHandler.java:853)
        at org.eclipse.jetty.servlet.ServletContextHandler.startContext(ServletContextHandler.java:370)
        at org.eclipse.jetty.webapp.WebAppContext.startWebapp(WebAppContext.java:1497)
        at org.eclipse.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1459)
        at org.eclipse.jetty.server.handler.ContextHandler.doStart(ContextHandler.java:785)
        at org.eclipse.jetty.servlet.ServletContextHandler.doStart(ServletContextHandler.java:287)
        at org.eclipse.jetty.webapp.WebAppContext.doStart(WebAppContext.java:545)
        at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68)
        at org.eclipse.jetty.util.component.ContainerLifeCycle.start(ContainerLifeCycle.java:138)
        at org.eclipse.jetty.server.Server.start(Server.java:419)
        at org.eclipse.jetty.util.component.ContainerLifeCycle.doStart(ContainerLifeCycle.java:108)
        at org.eclipse.jetty.server.handler.AbstractHandler.doStart(AbstractHandler.java:113)
        at org.eclipse.jetty.server.Server.doStart(Server.java:386)
        at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68)
        at com.example.JettyLauncher$.main(JettyLauncher.scala:20)
        at com.example.JettyLauncher.main(JettyLauncher.scala)

Here are the dependencies I'm using:

val jettyVersion = "9.4.10.v20180503"

def ivyDeps = Agg(
  ivy"org.scalatra::scalatra:2.6.3",
  ivy"javax.servlet:servlet-api:2.5",
  ivy"org.eclipse.jetty:jetty-server:$jettyVersion",
  ivy"org.eclipse.jetty:jetty-servlet:$jettyVersion",
  ivy"org.eclipse.jetty:jetty-webapp:$jettyVersion",
)

My JettyLauncher is a striaght copy from the web site, so far, except I changed the resourceBase to be something that actually exists (but it didn't help):

object JettyLauncher { // this is my entry object as specified in sbt project definition
  def main(args: Array[String]) {
    val port = if(System.getenv("PORT") != null) System.getenv("PORT").toInt else 5001

    val server = new Server(port)
    val context = new WebAppContext()
    context setContextPath "/"
    context.setResourceBase("repeater")
    context.addEventListener(new ScalatraListener)
    context.addServlet(classOf[DefaultServlet], "/")

    server.setHandler(context)

    server.start
    server.join
  }
}

My LifeCycle class is also fairly minimal:

class ScalatraBootstrap extends LifeCycle {
  override def init(context: ServletContext) {
    context mount (new RepeatAll, "/*")
  }
}

UPDATE

I changed to using ScalatraServlet instead of ScalatraServlet, but get a similar issue:

2018.05.23 18:39:24 [main] ERROR org.scalatra.servlet.ScalatraListener - Failed to initialize scalatra application at 
java.lang.NoSuchMethodError: javax.servlet.ServletContext.getServletRegistration(Ljava/lang/String;)Ljavax/servlet/ServletRegistration;
        at org.scalatra.servlet.RichServletContext.mountServlet(RichServletContext.scala:127)
        at org.scalatra.servlet.RichServletContext.mount(RichServletContext.scala:84)
        at org.scalatra.servlet.RichServletContext.mount(RichServletContext.scala:93)
        at org.scalatra.servlet.RichServletContext.mount(RichServletContext.scala:90)
        at ScalatraBootstrap.init(ScalatraBootstrap.scala:8)

Update 2

Another important part of the stacktrace I missed posting earlier:

2018.05.23 18:39:24 [main] WARN org.eclipse.jetty.webapp.WebAppContext - Failed startup of context o.e.j.w.WebAppContext@3d74bf60{/,file:///home/brandon/workspace/sbh/repeater,UNAVAILABLE}
java.lang.NoSuchMethodError: javax.servlet.ServletContext.getServletRegistration(Ljava/lang/String;)Ljavax/servlet/ServletRegistration;
        at org.scalatra.servlet.RichServletContext.mountServlet(RichServletContext.scala:127)
        at org.scalatra.servlet.RichServletContext.mount(RichServletContext.scala:84)
        at org.scalatra.servlet.RichServletContext.mount(RichServletContext.scala:93)

I tried putting a WEB-INF/web.xml under repeater as specified above, but same result.

bbarker
  • 11,636
  • 9
  • 38
  • 62
  • 2
    "no such method" error usually implies a library version mismatch. You will have to go through all of your Jetty modules and make sure all the versions are compatible, and they compatible with Scalatra. Word of warning: Jetty version management is a nightmare. – Bob Dalgleish May 23 '18 at 18:56
  • good point, and good point about the nightmare apparently, since this didn't seem to work; I tried specifying the version found at https://github.com/scalatra/scalatra/blob/v2.6.3/project/Dependencies.scala#L60 and no luck – bbarker May 23 '18 at 19:14
  • The next thing to do is to open the Jetty jar file in your IDE. You can check the class to see if it really does have a `getServletRegistration()` method defined with that signature. – Bob Dalgleish May 23 '18 at 19:30
  • You should use Servlet API 3.1.0. https://github.com/scalatra/scalatra/blob/v2.6.3/project/Dependencies.scala#L40 – Naoki Takezoe May 24 '18 at 16:26

0 Answers0