Servlet 类 org.restlet.ext.servlet.ServerServlet 不是 jakarta.servlet.Servlet
Posted
技术标签:
【中文标题】Servlet 类 org.restlet.ext.servlet.ServerServlet 不是 jakarta.servlet.Servlet【英文标题】:Servlet class org.restlet.ext.servlet.ServerServlet is not a jakarta.servlet.Servlet 【发布时间】:2021-01-14 22:51:03 【问题描述】:什么可能导致这个错误?
Caused by: jakarta.servlet.UnavailableException: Servlet class org.restlet.ext.servlet.ServerServlet is not a jakarta.servlet.Servlet
at org.eclipse.jetty.servlet.ServletHolder.checkServletType (ServletHolder.java:499)
at org.eclipse.jetty.servlet.ServletHolder.doStart (ServletHolder.java:377)
at org.eclipse.jetty.util.component.AbstractLifeCycle.start (AbstractLifeCycle.java:96)
at org.eclipse.jetty.servlet.ServletHandler.lambda$initialize$2 (ServletHandler.java:699)
at java.util.stream.SortedOps$SizedRefSortingSink.end (SortedOps.java:357)
at java.util.stream.AbstractPipeline.copyInto (AbstractPipeline.java:485)
at java.util.stream.AbstractPipeline.wrapAndCopyInto (AbstractPipeline.java:474)
at java.util.stream.StreamSpliterators$WrappingSpliterator.forEachRemaining (StreamSpliterators.java:312)
at java.util.stream.Streams$ConcatSpliterator.forEachRemaining (Streams.java:735)
at java.util.stream.ReferencePipeline$Head.forEach (ReferencePipeline.java:658)
at org.eclipse.jetty.servlet.ServletHandler.initialize(ServletHandler.java:724)
我正在通过mvn jetty:run
插件运行网络应用程序
【问题讨论】:
【参考方案1】:jakarta.servlet.UnavailableException: Servlet 类 [...] 不是 jakarta.servlet.Servlet
jakarta.servlet.Servlet
是 Servlet API 版本 5.0 的一部分,而后者又是 Jakarta EE 版本 9 的一部分。因此这只能意味着[...]
中指定的 servlet 类不是针对 Servlet API 版本 5.0 编译的,而是针对旧版本。
你有两个选择:
将[...]
中指定的servlet 类升级为与Servlet API 5.0 版兼容的类。
或者,将 Servlet 容器从 Servlet API 版本 5.0 降级到以前的版本,至少与 [...]
中指定的 servlet 类的目标 Servlet API 版本相匹配。
技术原因是在从 Java/Jakarta EE 8 到 Jakarta EE 9 的步骤中,所有 javax.*
包都已重命名为 jakarta.*
包。因此,自 Jakarta EE 9 以来不再存在向后兼容性。
当我们将上述事实转化为您的具体情况时,您唯一的选择是将 Jetty servlet 容器降级为 Servlet 4.0 兼容版本。这是因为第 3 方库“Restlet”目前根本没有 Servlet 5.0 兼容版本可用。根据 Jetty 的版本表,Jetty 11.x 是针对 Jakarta EE 9 的,因此您需要 Jetty 10.x 或更低版本。
或者,您可以完全放弃 Restlet 并改用 Jersey。它目前有可用的 Jakarta EE 9 兼容版本。
另见:
Jetty versions Getting java.lang.ClassNotFoundException: jakarta.servlet.Filter on Maven/Jersey web service while running on Tomcat 9【讨论】:
已经有`pom.xml
中的 provided
条目不会神奇地将目标运行时更改为预期版本。您仍然可以针对 Jetty 11.x 运行它并最终遇到指定的问题。如答案中所述,您需要将 Jetty 物理降级到 10.x 以符合 pom.xml 中指定的期望。
哦,你说得对。显然,在我的 POM 中,$jetty.version
已被删除,导致它获取版本 11,我的错。
可能发生最好的情况。
您可能也有兴趣对此***.com/questions/64118991/…发表评论【参考方案2】:
我试图在 Wildfly 服务器中运行 Maven 应用程序
我安装了20.0.1.Final,雅加达之前的最后一个版本
【讨论】:
以上是关于Servlet 类 org.restlet.ext.servlet.ServerServlet 不是 jakarta.servlet.Servlet的主要内容,如果未能解决你的问题,请参考以下文章
创建Servlet类,并重写Servlet接口,配置web.xml文件,实现Servlet访问
JavaWeb-Servlet笔记--- Servlet规范;Servlet接口实现类;Servlet对象生命周期;HttpServletResponse/HttpServletRequest;请求对
创建一个类去实现javax.servlet.servlet接口,为啥报错
jakarta.servlet.ServletException:类 [com.practice.MyServlet] 不是 Servlet