且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

Servlet 5.0 JAR会在javax.servlet.*上引发编译错误,但Servlet 4.0 JAR不会

更新时间:2023-12-04 14:49:52

当我将.class文件放在相应的Tomcat目录中,启动服务器并尝试与该应用进行交互时,出现以下异常:

java.lang.ClassNotFoundException: javax.servlet.http.HttpServlet

jakarta.servlet.Servlet 是Servlet API版本5.0的一部分,而Servlet API版本5.0又是Jakarta EE版本9的一部分.您的servlet实际上是从 javax.servlet.Servlet 反过来,它是旧版JEE版本的一部分,而目标运行时(Tomcat 10.x)实际上不支持该版本.

The jakarta.servlet.Servlet is part of Servlet API version 5.0 which in turn is part of Jakarta EE version 9. Your servlet is actually extending from javax.servlet.Servlet which in turn is part of an older JEE version which is actually not supported by your target runtime (Tomcat 10.x).

您有2个选择:

  1. jakarta.servlet.* 替换代码中的 javax.servlet.* 导入.

import jakarta.servlet.*;
import jakarta.servlet.http.*;

然后,您可以从基于Servlet 5.0的目标运行时中针对库进行编译.

Then you can just compile against the libraries from a Servlet 5.0 based target runtime.

或者,将Servlet容器从Servlet API 5.0版降级到以前的版本,至少一个仍具有 javax.servlet.* 包名称的容器.Tomcat 9.x是最新的版本,但仍带有旧软件包.

Or, downgrade the servlet container from Servlet API version 5.0 to a previous version, at least the one still having the javax.servlet.* package name. Tomcat 9.x is the latest one still having the old package.

技术原因是在从Java/Jakarta EE 8到Jakarta EE 9的步骤中,所有 javax.* 软件包都被重命名为 jakarta.* 软件包.因此,自Jakarta EE 9起,就不再存在向后兼容性.

The technical reason is that during the step from Java/Jakarta EE 8 to Jakarta EE 9 all javax.* packages have been renamed to jakarta.* packages. So there is no backwards compatibility anymore since Jakarta EE 9.

  • Apache Tomcat - versions
  • Tomcat casting servlets to javax.servlet.Servlet instead of jakarta.servlet.http.HttpServlet (this answer contains complete examples of proper pom.xml declarations for Tomcat 10+, Tomcat 9-, JEE 9+ and JEE 8-, just in case you're using Maven).