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

[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对项目进行部署,之后该问题便可解决

问题原因

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字段替换成以下字段来进行升级。
xml 复制代码
<!-- 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]

  2. 什么是Jakarta EE

相关推荐
桦说编程3 小时前
Java 中如何创建不可变类型
java·后端·函数式编程
lifallen3 小时前
Java Stream sort算子实现:SortedOps
java·开发语言
IT毕设实战小研3 小时前
基于Spring Boot 4s店车辆管理系统 租车管理系统 停车位管理系统 智慧车辆管理系统
java·开发语言·spring boot·后端·spring·毕业设计·课程设计
没有bug.的程序员4 小时前
JVM 总览与运行原理:深入Java虚拟机的核心引擎
java·jvm·python·虚拟机
甄超锋4 小时前
Java ArrayList的介绍及用法
java·windows·spring boot·python·spring·spring cloud·tomcat
阿华的代码王国4 小时前
【Android】RecyclerView复用CheckBox的异常状态
android·xml·java·前端·后端
Zyy~4 小时前
《设计模式》装饰模式
java·设计模式
A尘埃4 小时前
企业级Java项目和大模型结合场景(智能客服系统:电商、金融、政务、企业)
java·金融·政务·智能客服系统
青云交5 小时前
Java 大视界 -- 基于 Java 的大数据可视化在城市交通拥堵治理与出行效率提升中的应用(398)
java·大数据·flink·大数据可视化·拥堵预测·城市交通治理·实时热力图
CHEN5_025 小时前
【Java基础面试题】Java基础概念
java·开发语言