UnavailableException: Servlet class is not a javax.servlet.S



插件页面上给出的示例在使用最新版本的jetty容器和jakarta包进行更新时抛出异常。

它期望旧类javax.servlet。Servlet' not new 'jakarta.servlet.Servlet'

os: Ubuntu 22.10
java: openjdk version "11.0.11" 2021-04-20
scala: 2.13.10

build.sbt

ThisBuild / version := "0.1.0-SNAPSHOT"
ThisBuild / scalaVersion := "2.13.10"
lazy val root = (project in file("."))
.settings(
name := "MyServlet"
)
val jakartaServletApiVersion = "6.0.0"
val jettyVersion = "11.0.13"
libraryDependencies += "jakarta.servlet" % "jakarta.servlet-api" % jakartaServletApiVersion
Jetty / containerLibs := Seq("org.eclipse.jetty" % "jetty-runner" % jettyVersion)
enablePlugins(JettyPlugin)

plugins.sbt

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

web . xml

<servlet>
<servlet-name>MyServlet</servlet-name>
<servlet-class>mypackage.MyServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>MyServlet</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>

MyServlet.scala

package mypackage
import jakarta.servlet.annotation.WebServlet
import jakarta.servlet.http.{HttpServlet, HttpServletRequest, HttpServletResponse}
@WebServlet(urlPatterns = Array("/hello"))
class MyServlet extends HttpServlet {
println("HEY")
override def doGet(req: HttpServletRequest, res: HttpServletResponse): Unit = {
res.setContentType("text/html")
res.setCharacterEncoding("UTF-8")
res.getWriter.write("""<h1>Hello, world!</h1>""")
}
}

命令:

jetty:start
异常:

UnavailableException: Servlet类mypackage。MyServlet不是javax.servlet.Servlet

javax.servlet.UnavailableException: Servlet class mypackage.MyServlet is not a javax.servlet.Servlet
at org.eclipse.jetty.servlet.ServletHolder.checkServletType(ServletHolder.java:514)
at org.eclipse.jetty.servlet.ServletHolder.doStart(ServletHolder.java:386)
at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:73)
at org.eclipse.jetty.servlet.ServletHandler.lambda$initialize$0(ServletHandler.java:730)
at java.base/java.util.stream.SortedOps$SizedRefSortingSink.end(SortedOps.java:357)
at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:485)
at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:474)
at java.base/java.util.stream.StreamSpliterators$WrappingSpliterator.forEachRemaining(StreamSpliterators.java:312)
at java.base/java.util.stream.Streams$ConcatSpliterator.forEachRemaining(Streams.java:735)
at java.base/java.util.stream.ReferencePipeline$Head.forEach(ReferencePipeline.java:658)
at org.eclipse.jetty.servlet.ServletHandler.initialize(ServletHandler.java:755)
at org.eclipse.jetty.servlet.ServletContextHandler.startContext(ServletContextHandler.java:379)
at org.eclipse.jetty.webapp.WebAppContext.startWebapp(WebAppContext.java:1449)
at org.eclipse.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1414)
at org.eclipse.jetty.server.handler.ContextHandler.doStart(ContextHandler.java:911)
at org.eclipse.jetty.servlet.ServletContextHandler.doStart(ServletContextHandler.java:288)
at org.eclipse.jetty.webapp.WebAppContext.doStart(WebAppContext.java:524)
at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:73)
at org.eclipse.jetty.util.component.ContainerLifeCycle.start(ContainerLifeCycle.java:169)
at org.eclipse.jetty.util.component.ContainerLifeCycle.doStart(ContainerLifeCycle.java:117)
at org.eclipse.jetty.server.handler.AbstractHandler.doStart(AbstractHandler.java:97)
at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:73)
at org.eclipse.jetty.util.component.ContainerLifeCycle.start(ContainerLifeCycle.java:169)
at org.eclipse.jetty.util.component.ContainerLifeCycle.doStart(ContainerLifeCycle.java:117)
at org.eclipse.jetty.server.handler.AbstractHandler.doStart(AbstractHandler.java:97)
at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:73)
at org.eclipse.jetty.util.component.ContainerLifeCycle.start(ContainerLifeCycle.java:169)
at org.eclipse.jetty.server.Server.start(Server.java:423)
at org.eclipse.jetty.util.component.ContainerLifeCycle.doStart(ContainerLifeCycle.java:110)
at org.eclipse.jetty.server.handler.AbstractHandler.doStart(AbstractHandler.java:97)
at org.eclipse.jetty.server.Server.doStart(Server.java:387)
at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:73)
at org.eclipse.jetty.runner.Runner.run(Runner.java:519)
at org.eclipse.jetty.runner.Runner.main(Runner.java:564)
请问我做错了什么?

项目的类路径中有多个Jetty版本。

将它们全部对齐到一个版本。

不确定您的构建工具是什么样子的,但是Jetty提供了一个Jetty -bom,可以帮助您对齐Jetty工件的版本,而不管它们来自您的构建中的哪里(例如:传递依赖)

Jetty 11.0.13使用Jakarta Servlet 5.0,而不是6.0

https://github.com/eclipse/jetty.project/blob/jetty-11.0.13/pom.xml L65

另外,不要在构建工具中使用jetty-runner,这是一个过时的概念,只适用于最简单的webapps的命令行使用。

https://github.com/eclipse/jetty.project/blob/jetty-11.0.13/jetty-runner/src/main/java/org/eclipse/jetty/runner/Runner.java L68-L70

请正确使用jetty-home和单独的jetty-base。

相关内容

最新更新