0

描述

当我开发我的 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

使固定

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

<!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>4.0.1</version>
    <scope>provided</scope>
</dependency>

问题

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

1 回答 1

1

为什么在迁移到 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-api4.0.1

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

  3. 使用Maven 依赖树插件来尝试识别您的应用程序依赖项中的哪些依赖于旧javax.servletAPI。寻找替代使用的那些依赖项的更新版本jakarta.servlet

如果 2 和 3 不能确定罪魁祸首,那就很难了。您可能需要解压缩所有相关的 JAR 文件并使用javapand来“分析”它们grep。或者可能有更好的方法。

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

于 2022-01-20T11:44:39.000 回答