[Tomcat问题]--使用Tomcat 10.x部署项目时,出现实例化Servlet类[xxx]异常

本文讲述了在使用Tomcat10.x部署Servlet项目时遇到的NoClassDefFoundError,原因在于Tomcat10基于ServletAPI5.0,需降级至Tomcat9.x或调整依赖,以适应ServletAPI4.0。文章还揭示了JakartaEE的历史更迭和命名空间变化的背景。

[Tomcat问题]–使用Tomcat 10.x部署项目时,出现实例化Servlet类[xxx]异常

本片博文在知乎同步更新

环境

  • OS: Windows 11 23H2
  • Java Version: java 21.0.1 2023-10-17 LTS
  • IDE: IntelliJ IDEA 2023.3.3
  • Maven: Apache Maven 3.9.6
  • Tomcat: Tomcat 10.1.18 Released
  • Servlet: 4.0.1
  • Jsp Api: 2.3.3

问题描述

在使用Tomcat 10.x版本配置并部署Servlet项目时,出现无法实例化Servlet类的问题,原因是Tomcat的版本过高,需要回退到Tomcat 9.x对项目进行部署,之后该问题便可解决

HTTP状态500 - 服务器内部错误

问题原因

Tomcat 10.x的开发是基于Servlet API 5.0版本来实现的,而该版本又是Jakarta EE 9中的一部分。除非我们的Servlet是5.0版本,否则在使用Tomcat10对web程序部署的时候,并不会去寻找javax.servlet.*,而是去寻找jakarta.servlet.*1

为什么要去寻找jakarta.servlet.*

这里面的问题堪比国产肥皂剧。Jakarta EE并不是什么新技术,其实就是我们所熟知的Java EE。1998年SUN公司在发布了JDK 1.2之后联合其他几家大型企业共同制定了一个系统开发规范,名字取做Java 2 Platform Enterprise Edition,简称J2EE。但是JDK版本升级的很快,为了不让开发人员对J2EE产生困惑或者影响java技术的推广,2006年,SUN公司正式将J2EE更名为Java EE。

2009年Oracle公司宣布收购SUN公司,自然而然java的相关技术也归为Oracle所有。2017年Oracle决定开源Java EE,并将它移交到Eclipse公司。但移交的过程并不痛快,提了很多要求。其中就要求不能再使用Java EE这个名字,并要求更名为Jakarta EE。更要命的是Oracle公司宣布不能修改javax的命名空间,这也间接导致了移交之后javax的相关代码更新到此截至。2

欸?我就是不让你用。欸?我就是玩~~~。从J2EE到Java EE,再到Jakarta EE,反正就是主打一手折腾,实际的意义就是没有意义。

好了,言归正传,那我们如何该解决这个问题呢?

解决方法

  1. 对Tomcat降级,Tomcat9.x是支持Servlet API 4.0版本的
  2. 对Servlet API进行升级,可以从官网下载或者直接将旧版本的Servlet的maven字段替换成以下字段来进行升级。
<!-- https://mvnrepository.com/artifact/jakarta.servlet/jakarta.servlet-api -->
<dependency>
    <groupId>jakarta.servlet</groupId>
    <artifactId>jakarta.servlet-api</artifactId>
    <version>5.0.0</version>
    <scope>provided</scope>
</dependency>

参考信息

  1. Tomcat 10.x throws java.lang.NoClassDefFoundError on javax.servlet.* [duplicate]
  1. 什么是Jakarta EE
25-Oct-2025 00:53:08.425 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log Server.服务器版本: Apache Tomcat/10.1.48 25-Oct-2025 00:53:08.441 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 服务器构建: Oct 10 2025 14:33:56 UTC 25-Oct-2025 00:53:08.455 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 服务器版本号: 10.1.48.0 25-Oct-2025 00:53:08.455 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 操作系统名称: Windows 11 25-Oct-2025 00:53:08.457 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log OS.版本: 10.0 25-Oct-2025 00:53:08.457 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 架构: amd64 25-Oct-2025 00:53:08.457 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log Java 环境变量: C:\Program Files\Java\jdk-22 25-Oct-2025 00:53:08.457 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log Java虚拟机版本: 22.0.1+8-16 25-Oct-2025 00:53:08.457 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log JVM.供应商: Oracle Corporation 25-Oct-2025 00:53:08.457 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log CATALINA_BASE: D:\tomcat\apache-tomcat-10.1.48-windows-x64\apache-tomcat-10.1.48 25-Oct-2025 00:53:08.457 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log CATALINA_HOME: D:\tomcat\apache-tomcat-10.1.48-windows-x64\apache-tomcat-10.1.48 25-Oct-2025 00:53:08.560 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数: -Djava.util.logging.config.file=D:\tomcat\apache-tomcat-10.1.48-windows-x64\apache-tomcat-10.1.48\conf\logging.properties 25-Oct-2025 00:53:08.561 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数: -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager 25-Oct-2025 00:53:08.561 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数: -Djdk.tls.ephemeralDHKeySize=2048 25-Oct-2025 00:53:08.562 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数: -Djava.protocol.handler.pkgs=org.apache.catalina.webresources 25-Oct-2025 00:53:08.562 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数: -Dsun.io.useCanonCaches=false 25-Oct-2025 00:53:08.562 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数: --add-opens=java.base/java.lang=ALL-UNNAMED 25-Oct-2025 00:53:08.563 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数: --add-opens=java.base/java.lang.reflect=ALL-UNNAMED 25-Oct-2025 00:53:08.563 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数: --add-opens=java.base/java.io=ALL-UNNAMED 25-Oct-2025 00:53:08.563 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数: --add-opens=java.base/java.util=ALL-UNNAMED 25-Oct-2025 00:53:08.563 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数: --add-opens=java.base/java.util.concurrent=ALL-UNNAMED 25-Oct-2025 00:53:08.563 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数: --add-opens=java.rmi/sun.rmi.transport=ALL-UNNAMED 25-Oct-2025 00:53:08.563 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数: -Dcatalina.base=D:\tomcat\apache-tomcat-10.1.48-windows-x64\apache-tomcat-10.1.48 25-Oct-2025 00:53:08.567 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数: -Dcatalina.home=D:\tomcat\apache-tomcat-10.1.48-windows-x64\apache-tomcat-10.1.48 25-Oct-2025 00:53:08.567 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数: -Djava.io.tmpdir=D:\tomcat\apache-tomcat-10.1.48-windows-x64\apache-tomcat-10.1.48\temp 25-Oct-2025 00:53:08.579 信息 [main] org.apache.catalina.core.AprLifecycleListener.lifecycleEvent 使用APR版本[1.7.6]加载了基于APR的Apache Tomcat本机库[2.0.9]。 25-Oct-2025 00:53:08.595 信息 [main] org.apache.catalina.core.AprLifecycleListener.initializeSSL OpenSSL成功初始化 [OpenSSL 3.5.0 8 Apr 2025] 25-Oct-2025 00:53:09.477 信息 [main] org.apache.coyote.AbstractProtocol.init 初始化协议处理器 ["http-nio-8080"] 25-Oct-2025 00:53:09.579 信息 [main] org.apache.catalina.startup.Catalina.load 服务器在[1862]毫秒内初始化 25-Oct-2025 00:53:09.729 信息 [main] org.apache.catalina.core.StandardService.startInternal 正在启动服务[Catalina] 25-Oct-2025 00:53:09.729 信息 [main] org.apache.catalina.core.StandardEngine.startInternal 正在启动 Servlet 引擎:[Apache Tomcat/10.1.48] 25-Oct-2025 00:53:09.745 信息 [main] org.apache.catalina.startup.HostConfig.deployDirectory 把web 应用程序部署到目录 [D:\tomcat\apache-tomcat-10.1.48-windows-x64\apache-tomcat-10.1.48\webapps\docs] 25-Oct-2025 00:53:10.786 信息 [main] org.apache.catalina.startup.HostConfig.deployDirectory Web应用程序目录[D:\tomcat\apache-tomcat-10.1.48-windows-x64\apache-tomcat-10.1.48\webapps\docs]的部署已在[1,022]毫秒内完成 25-Oct-2025 00:53:10.788 信息 [main] org.apache.catalina.startup.HostConfig.deployDirectory 把web 应用程序部署到目录 [D:\tomcat\apache-tomcat-10.1.48-windows-x64\apache-tomcat-10.1.48\webapps\examples] 25-Oct-2025 00:53:11.839 信息 [main] org.apache.catalina.startup.HostConfig.deployDirectory Web应用程序目录[D:\tomcat\apache-tomcat-10.1.48-windows-x64\apache-tomcat-10.1.48\webapps\examples]的部署已在[1,051]毫秒内完成 25-Oct-2025 00:53:11.839 信息 [main] org.apache.catalina.startup.HostConfig.deployDirectory 把web 应用程序部署到目录 [D:\tomcat\apache-tomcat-10.1.48-windows-x64\apache-tomcat-10.1.48\webapps\host-manager] 25-Oct-2025 00:53:11.960 信息 [main] org.apache.catalina.startup.HostConfig.deployDirectory Web应用程序目录[D:\tomcat\apache-tomcat-10.1.48-windows-x64\apache-tomcat-10.1.48\webapps\host-manager]的部署已在[111]毫秒内完成 25-Oct-2025 00:53:11.960 信息 [main] org.apache.catalina.startup.HostConfig.deployDirectory 把web 应用程序部署到目录 [D:\tomcat\apache-tomcat-10.1.48-windows-x64\apache-tomcat-10.1.48\webapps\manager] 25-Oct-2025 00:53:12.007 信息 [main] org.apache.catalina.startup.HostConfig.deployDirectory Web应用程序目录[D:\tomcat\apache-tomcat-10.1.48-windows-x64\apache-tomcat-10.1.48\webapps\manager]的部署已在[47]毫秒内完成 25-Oct-2025 00:53:12.007 信息 [main] org.apache.catalina.startup.HostConfig.deployDirectory 把web 应用程序部署到目录 [D:\tomcat\apache-tomcat-10.1.48-windows-x64\apache-tomcat-10.1.48\webapps\ROOT] 25-Oct-2025 00:53:12.060 信息 [main] org.apache.catalina.startup.HostConfig.deployDirectory Web应用程序目录[D:\tomcat\apache-tomcat-10.1.48-windows-x64\apache-tomcat-10.1.48\webapps\ROOT]的部署已在[53]毫秒内完成 25-Oct-2025 00:53:12.075 信息 [main] org.apache.coyote.AbstractProtocol.start 开始协议处理句柄["http-nio-8080"] 25-Oct-2025 00:53:12.195 信息 [main] org.apache.catalina.startup.Catalina.start [2608]毫秒后服务器启动 25-Oct-2025 00:53:58.979 信息 [main] org.apache.catalina.core.StandardServer.await 通过关闭端口接收到有效的关闭命令。正在停止服务器实例。 25-Oct-2025 00:53:58.984 信息 [main] org.apache.coyote.AbstractProtocol.pause 暂停ProtocolHandler["http-nio-8080"] 25-Oct-2025 00:53:59.004 信息 [main] org.apache.catalina.core.StandardService.stopInternal 正在停止服务[Catalina] 25-Oct-2025 00:53:59.071 信息 [main] org.apache.coyote.AbstractProtocol.stop 正在停止ProtocolHandler ["http-nio-8080"] 25-Oct-2025 00:53:59.079 信息 [main] org.apache.coyote.AbstractProtocol.destroy 正在销毁协议处理器 ["http-nio-8080"]
最新发布
10-26
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值