You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决Scalatra初始化时的NoSuchMethodError: ServletContext.getFilterRegistration错误

问题根源分析

你遇到的NoSuchMethodError本质是Servlet API版本不兼容:

  • 你配置的servlet-api:2.5是非常老旧的版本(对应Servlet 2.5规范),而ServletContext.getFilterRegistration()和getServletRegistration()这两个方法是从Servlet 3.0才开始引入的。
  • Scalatra 2.6.x和你使用的Jetty 9.4.x都基于Servlet 3.1规范开发,依赖这些新增的API方法,所以用2.5版本的API会直接抛出方法缺失错误。
解决方案:升级Servlet API依赖

把你的Mill依赖配置里的servlet-api:2.5替换为Servlet 3.1的官方API包,同时注意Jetty本身已经包含Servlet API的实现,所以我们可以将这个依赖标记为provided(避免和Jetty自带的实现冲突)。

修改后的依赖配置如下:

val jettyVersion = "9.4.10.v20180503"
def ivyDeps = Agg(
  ivy"org.scalatra::scalatra:2.6.3",
  // 替换为Servlet 3.1 API,标记为provided
  ivy"javax.servlet:javax.servlet-api:3.1.0;provided",
  ivy"org.eclipse.jetty:jetty-server:$jettyVersion",
  ivy"org.eclipse.jetty:jetty-servlet:$jettyVersion",
  ivy"org.eclipse.jetty:jetty-webapp:$jettyVersion",
)
额外说明
  • 为什么用provided?因为Jetty作为Servlet容器,已经自带了Servlet API的完整实现,我们只需要在编译时依赖API规范,运行时由Jetty提供实现,这样可以避免依赖冲突。
  • 你不需要修改JettyLauncher或ScalatraBootstrap的代码,它们本身没有问题,只是依赖版本不匹配导致的初始化失败。

修改完依赖后,重新用Mill构建并启动项目,应该就能正常初始化Scalatra应用了。

内容的提问来源于stack exchange,提问作者bbarker

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:59:14