当前位置: 首页 > news >正文

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

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

相关文章:

  • 113.路径总和 II
  • Linux命令-basename命令(打印目录或者文件的基本名称)
  • VSCode如何让先前打开的文件不被自动关闭,一直保持在标签栏里(关闭预览模式)
  • Qt博客目录
  • ARP欺骗攻击利用之内网截取图片
  • 【多模态MLLMs+图像编辑】MGIE:苹果开源基于指令和大语言模型的图片编辑神器(24.02.03开源)
  • 微服务入门篇:Nacos注册中心(Nacos安装,快速入门,多级存储,负载均衡,环境隔离,配置管理,热更新,集群搭建,nginx反向代理)
  • C语言:操作符详解
  • 设置了.gitignore文件,但某些需要被忽略的文件仍然显示
  • 法国实习面试——计算机相关专业词汇
  • MySQL单主模式部署组复制集群
  • 【Unity】重力场中的路径预测方法
  • 8.0 Zookeeper 四字命令教程详解
  • 使用x86架构+Nvidia消费显卡12G显存,搭建智能终端,将大模型本地化部署,说不定是未来方向,开源交互机器人设计
  • 寒假作业-day5
  • 【407天】跃迁之路——程序员高效学习方法论探索系列(实验阶段164-2018.03.19)...
  • 【css3】浏览器内核及其兼容性
  • 【刷算法】从上往下打印二叉树
  • chrome扩展demo1-小时钟
  • codis proxy处理流程
  • es6
  • Eureka 2.0 开源流产,真的对你影响很大吗?
  • react 代码优化(一) ——事件处理
  • 阿里云应用高可用服务公测发布
  • 聊聊flink的BlobWriter
  • 前端 CSS : 5# 纯 CSS 实现24小时超市
  • 前端技术周刊 2019-02-11 Serverless
  • 强力优化Rancher k8s中国区的使用体验
  • 腾讯优测优分享 | Android碎片化问题小结——关于闪光灯的那些事儿
  • 我有几个粽子,和一个故事
  • 小程序测试方案初探
  • Oracle Portal 11g Diagnostics using Remote Diagnostic Agent (RDA) [ID 1059805.
  • #Linux(make工具和makefile文件以及makefile语法)
  • ()、[]、{}、(())、[[]]等各种括号的使用
  • (java版)排序算法----【冒泡,选择,插入,希尔,快速排序,归并排序,基数排序】超详细~~
  • (Java数据结构)ArrayList
  • (Redis使用系列) SpringBoot 中对应2.0.x版本的Redis配置 一
  • (附源码)计算机毕业设计SSM智能化管理的仓库管理
  • (一)插入排序
  • (转)一些感悟
  • (转载)VS2010/MFC编程入门之三十四(菜单:VS2010菜单资源详解)
  • .NET Conf 2023 回顾 – 庆祝社区、创新和 .NET 8 的发布
  • .NET MVC之AOP
  • .net 流——流的类型体系简单介绍
  • .net项目IIS、VS 附加进程调试
  • .NET中的十进制浮点类型,徐汇区网站设计
  • .NET中统一的存储过程调用方法(收藏)
  • @AutoConfigurationPackage的使用
  • @ModelAttribute使用详解
  • @Not - Empty-Null-Blank
  • @Valid和@NotNull字段校验使用
  • @vue/cli 3.x+引入jQuery
  • []串口通信 零星笔记
  • [8-27]正则表达式、扩展表达式以及相关实战
  • [AIGC] 如何建立和优化你的工作流?