Как преодолеть проблему инициализации Scalatra: NoSuchMethodError: javax.servlet.ServletContext.getFilterRegistration? - PullRequest
0 голосов
/ 23 мая 2018

Я впервые использую Scalatra, и я использую его вне SBT (сборка и запуск с использованием mill).Я получаю следующую ошибку, которая, по-видимому, связана с отсутствующей зависимостью.

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)

Вот зависимости, которые я использую:

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 - это копия из базы данныхпока что веб-сайт, за исключением того, что я изменил resourceBase, чтобы он стал чем-то, что действительно существует (но это не помогло):

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
  }
}

Мой класс LifeCycle также довольно минимален:

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

ОБНОВЛЕНИЕ

Я перешел на использование ScalatraServlet вместо ScalatraServlet, но получил похожую проблему:

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)

Обновление2

Другая важная часть трассировки стека, которую я пропустил ранее:

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)

Я пытался поставить WEB-INF/web.xml под repeater, как указано выше, но тот же результат.

...