Servlet 类 org.restlet.ext.servlet.ServerServlet 不是 jakarta.servlet.Servlet

问题描述 投票:0回答:2

什么可能导致此错误?

    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
插件运行网络应用程序

servlets jetty restlet
2个回答
10
投票

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 个选择:

  1. [...]
    中指定的Servlet类升级为Servlet API版本5.0兼容的类。

  2. 或者,将 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”目前(2024 年 7 月)仍然没有 Servlet 5.0 兼容版本可用。根据 Jetty 的版本表,Jetty 11.x 是针对 Jakarta EE 9 的,因此您需要 Jetty 版本 10.x 或更早版本。如果您使用 Tomcat,则需要 Tomcat 版本 9.x 或更早版本。

或者,您可以完全放弃 Restlet 并使用 Jersey 代替。目前有 Jakarta EE 9 兼容版本可用。或者,当您实际针对 Jakarta EE 服务器(例如 WildFly、GlassFish、Liberty 等)时,只需使用内置的 Jakarta RESTful (JAX-RS) 功能,而不需要任何额外的依赖项。

另请参阅:


0
投票

我试图在 Wildfly 服务器内运行 Maven 应用程序

我安装了20.0.1.Final,雅加达之前的最后一个版本

© www.soinside.com 2019 - 2024. All rights reserved.