问题描述
什么可能导致此错误?
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
插件运行网络应用
解决方法
jakarta.servlet.UnavailableException:Servlet类[...]不是jakarta.servlet.Servlet
jakarta.servlet.Servlet
是Servlet API版本5.0的一部分,而Servlet API版本5.0又是Jakarta EE版本9的一部分。这仅意味着[...]
中指定的Servlet类未针对Servlet API版本进行编译。 5.0,但使用的是旧版本。
您有2个选择:
-
将
[...]
中指定的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兼容版本。这是因为第三方库“ Restlet”目前根本没有Servlet 5.0兼容版本。根据Jetty的版本表,Jetty 11.x是Jakarta EE 9的目标,因此您需要Jetty 10.x或更早的版本。
或者,您可以完全放下Restlet,而改用Jersey。目前,它具有与Jakarta EE 9兼容的版本。