Как решить проблему инициализации Scalatra: NoSuchMethodError: javax.servlet.ServletContext.getFilterRegistration?

Я впервые использую 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",
)

Мой JettyLauncher пока что представляет собой полосатую копию с веб-сайта, за исключением того, что я изменил ресурсную базу на то, что действительно существует (но это не помогло):

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, как указано выше, но результат тот же.

Ошибка «нет такого метода» обычно подразумевает несоответствие версии библиотеки. Вам нужно будет просмотреть все ваши модули Jetty и убедиться, что все версии совместимы и совместимы со Scalatra. Предупреждение: управление версиями Jetty - это кошмар.

Bob Dalgleish 23.05.2018 20:56

хорошее замечание и, по-видимому, хорошее замечание о кошмаре, поскольку это, похоже, не сработало; Я попытался указать версию, найденную в github.com/scalatra/scalatra/blob/v2.6.3/project/…, и не повезло

bbarker 23.05.2018 21:14

Следующее, что нужно сделать, это открыть файл jar Jetty в вашей среде IDE. Вы можете проверить класс, чтобы увидеть, действительно ли у него есть метод getServletRegistration(), определенный с этой сигнатурой.

Bob Dalgleish 23.05.2018 21:30

Вы должны использовать Servlet API 3.1.0. github.com/scalatra/scalatra/blob/v2.6.3/project/…

Naoki Takezoe 24.05.2018 18:26
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
4
596
0

Другие вопросы по теме