java: 无法访问 javax.servlet.ServletException 类文件,因为找不到 javax.servlet.ServletException

Dha*_*a07 6 java tomcat java-8 tomcat9 tomcat10

描述

当我开发我的java项目时,我使用:
Java version: 1.8
Apache Tomcat version 9.0.x

然后,我用来Tomcat 10.0.x运行我的项目(对我的项目进行了很少的修改)。我必须将javax与包相关的导入更改为jakarta包导入。

当我构建项目时,我收到以下错误;

java: cannot access javax.servlet.ServletException  
class file for javax.servlet.ServletException not found
Run Code Online (Sandbox Code Playgroud)

使固定

当我搜索修复程序时,我发现我需要在文件Java Servlet API中包含依赖项pom.xml。这样我就可以成功构建项目了。

java: cannot access javax.servlet.ServletException  
class file for javax.servlet.ServletException not found
Run Code Online (Sandbox Code Playgroud)

问题

  1. Java Servlet API为什么我在迁移到 Tomcat 10 时必须包含依赖项?
  2. 我确实包含了Java Servlet API依赖项,但这是一个正确的修复吗?

Ste*_*n C 3

当我迁移到 Tomcat 10 时,为什么必须包含 Java Servlet API 依赖项?

可能是因为您的应用程序依赖于符合 JSP 4.0.x 规范的内容。

我确实包含了 Java Servlet API 依赖项,但这是一个正确的修复吗?

不,这不是正确的修复方法。虽然您已成功构建应用程序,但在部署到 Tomcat 10 时,您大多数会遇到类加载器错误。这是因为 Tomcat 10 运行时库不提供这些javax.servlet.*类。

正确的方法是确定为什么您的应用程序或其依赖项试图在javax.servlet...中使用类并消除这种情况。

  1. javax.servlet//删除javax.servlet-api依赖4.0.1

  2. 在您的应用程序代码库中搜索对javax.servlet...的任何剩余引用并更改它们。

  3. 使用Maven 依赖关系树插件尝试识别哪些应用程序依赖项依赖于旧javax.servletAPI。寻找那些使用的依赖项的较新版本jakarta.servlet

如果2和3不能确定罪魁祸首,事情就会变得相当困难。您可能需要解压所有依赖的 JAR 文件并使用javap和 来“分析”它们grep。或者可能有更好的方法。

如果您能够识别依赖项,但找不到与 Jakarta 兼容的版本,那么您会遇到另一种问题。您必须选择是努力移植依赖项、寻找另一个库(或其他库)来提供该功能,还是从您的 Web 应用程序中删除该功能。