Spring MVC + Tomcat 8.5 踩坑实录:Servlet 版本引发的部署失败
🚧 Spring MVC + Tomcat 8.5 踩坑实录:Servlet 版本引发的部署失败
🌐 作者:劲爽小猴头
🗓️ 时间:2025-05-28
📚 关键词:Spring MVC、Tomcat、Servlet、WAR部署、web.xml、Maven、JDK 22
🧩 项目背景
在搭建一个经典的 Spring MVC 项目时,遇到严重的 Tomcat 启动失败问题。环境配置如下:
-
IDEA:2024.1
-
JDK:22
-
Tomcat:8.5.97
-
Spring Framework:5.3.34
-
Servlet API:原来是 4.0.1
-
打包方式:Maven + WAR
🚨 遇到的错误信息
部署项目到 Tomcat 后,控制台抛出如下错误:
Caused by: java.lang.IllegalArgumentException: 找到名为 [spring_web] 的片段。这不是一个合法的名字...
紧接着部署失败,报错信息中还提示:
Cannot deploy artifact springmvc-demo:war
Illegal web fragment name
此外,在 web.xml
文件中 IDEA 出现密集报错,例如:
-
Element web-app must be declared
-
Cannot resolve symbol 'servlet-name'
-
Multiple root tags
🔍 问题根因分析
1️⃣ Servlet 版本冲突
-
Tomcat 8.5 的原生支持为 Servlet 3.0/3.1
-
但项目中引入了 Servlet 4.0.1,导致 web fragment 名称验证失败
2️⃣ web.xml
schema 版本不兼容
-
原来使用的是:
<web-app version="4.0">
-
IDEA 和 Tomcat 均对这个 schema 支持不佳,IDE 识别失败,Tomcat 启动异常。
🛠️ 解决方案(最终稳定方案)
✅ 一、降级 Servlet API 到 3.0.1
在 pom.xml
中修改依赖:
<dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>3.0.1</version><scope>provided</scope>
</dependency>
⚠️ 注意:
scope
必须是provided
,否则会导致 WAR 包重复引入 servlet 相关类。
✅ 二、重写 web.xml 使用 Servlet 3.0 schema
替换为如下配置(位于 src/main/webapp/WEB-INF/web.xml
):
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://java.sun.com/xml/ns/javaeehttp://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"version="3.0"><display-name>Spring MVC Demo</display-name><servlet><servlet-name>dispatcher</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><init-param><param-name>contextConfigLocation</param-name><param-value>/WEB-INF/dispatcher-servlet.xml</param-value></init-param><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>dispatcher</servlet-name><url-pattern>/</url-pattern></servlet-mapping><!-- 关闭 web-fragment 检查 --><absolute-ordering/>
</web-app>
🧪 重启部署流程
mvn clean package
然后重新部署 springmvc-demo.war
到 Tomcat。
如果使用的是 IntelliJ:
-
Build Artifact →
springmvc-demo:war exploded
-
在 Run Configuration 中部署该 exploded artifact
-
启动 Tomcat
✅ 最终结果
🚀 浏览器访问 http://localhost:8080/springmvc-demo/
,看到页面输出:
👾 Hello Spring MVC!
✅ 不再出现 IllegalArgumentException
✅ IDEA 中的 web.xml
不再红色报错
✅ Tomcat 启动顺利,部署成功!
📌 总结 & 教训
问题 | 解决方式 |
---|---|
Servlet 版本过高 | 使用 3.0.1 ,避免 Tomcat 8.5 不兼容 |
web.xml 报错 | 降级 schema 至 3.0 |
Tomcat 部署失败 | 关闭 web-fragment 排序 |
🧠 技术启示:
-
servlet-api 版本要和 Tomcat 版本精确匹配
-
IDEA 对 XML schema 的识别和语义检查十分敏感
-
Spring MVC 老项目依然稳定,但对配置正确性要求更高
🧙 Bonus:下一步可以做什么?
-
☁️ 升级为 Spring Boot 避免 WAR 配置烦恼
-
🧪 加入表单登录、拦截器、REST API
-
🚀 用 Thymeleaf 替代 JSP 以获得更现代的体验
相关文章:
Spring MVC + Tomcat 8.5 踩坑实录:Servlet 版本引发的部署失败
🚧 Spring MVC Tomcat 8.5 踩坑实录:Servlet 版本引发的部署失败 🌐 作者:劲爽小猴头 🗓️ 时间:2025-05-28 📚 关键词:Spring MVC、Tomcat、Servlet、WAR部署、web.xml、Maven、JD…...

从“固定“到“流动“:移动充电如何重塑用户体验?
在传统充电模式中,"固定"不仅是技术的特征,更成为用户行为的枷锁——人们需要规划行程、寻找插座、等待电量填满,这种被动适配正在被移动充电技术颠覆。当充电设备从墙面解放,化身可携带的能源胶囊,甚至嵌入…...

玩客云 OEC/OECT 笔记(1) 拆机刷入Armbian固件
目录 玩客云 OEC/OECT 笔记(1) 拆机刷入Armbian固件玩客云 OEC/OECT 笔记(2) 运行RKNN程序 外观 内部 PCB正面 PCB背面 PCB背面 RK3566 1Gbps PHY 配置 OEC 和 OECT(OEC-turbo) 都是基于瑞芯微 RK3566/RK3568 的网络盒子, 没有HDMI输入输出. 硬件上 OEC 和 OECT…...
docker环境添加安装包持久性更新
1、进入docker 环境 2、安装新的安装包 pip install XXXX3、不要退出docker,新开终端,给当前环境从新打包更新镜像 docker commit ad6e1d2c5869 mynewpythonimagead6e1d2c5869是上面运行中的容器id, docker images 查看mynewpythonimage是新…...

GIS数据类型综合解析
GIS数据类型综合解析 目录 GIS数据类型综合解析1. 总体介绍2. GIS数据类型分类与对比2.1 主要数据类型对比表 3. 详细解析与扩展内容3.1 矢量数据(Vector Data)3.2 栅格数据(Raster Data)3.3 属性数据(Attribute Data&…...
VR 汽车:引领生产与设计的革命性飞跃
在汽车生产设计环节,VR 技术同样发挥着不可替代的重要作用。回首过去,设计师们设计一款新车时,面临着极为繁琐且艰巨的任务。首先,要绘制海量的图纸,从车辆的整体轮廓到每一个零部件的精细构造,都需用精准的…...

Prometheus + Grafana 监控常用服务
一、引言 Prometheus监控常见服务的原理主要包括服务暴露指标和Prometheus抓取指标。一方面,被监控服务通过自身提供的监控接口或借助Exporter将服务的性能指标等数据以HTTP协议的方式暴露出来;另一方面,Prometheus根据配置好的采集任务&…...

6月1日星期日今日早报简报微语报早读
6月1日星期日,农历五月初六,早报#微语早读。 1、10个省份城镇化率超70%,广东城镇人口超9700万; 2、长沙居民起诉太平财险不赔“新冠险”,立案878天后获胜判; 3、海口:全市范围内禁止投放互联…...
盲盒经济2.0:数字藏品开箱是否适用赌博法规
首席数据官高鹏律师团队编著 一、年轻人的“盲盒信仰”,法律的灰色地带 近年来,“盲盒经济”从实体玩具扩展到数字藏品领域,掀起了一波全民开箱热潮。年轻人在社交平台上晒出“开箱暴击”的喜悦,平台方则以“限量发行”“价值赋…...

如何在 Ubuntu 24.04 服务器上安装 Apache Solr
Apache Solr 是一个免费、开源的搜索平台,广泛应用于实时索引。其强大的可扩展性和容错能力使其在高流量互联网场景下表现优异。 Solr 基于 Java 开发,提供了分布式索引、复制、负载均衡及自动故障转移和恢复等功能。 本教程将指导您如何在 Ubuntu 24.…...

unity编辑器扩展dll形式展示
1.背景:最近搞工程迁移发现一旦c#报错就会导致编辑器菜单没法使用,做了一些尝试发现使用dll的方式会是不错的选择。当然有些工具还是建议用外部的c#工程来写比如winform. 2.遇到的问题:我记得之前2017年左右的时候做一个unity的dll工程并不需…...

vscode中launch.json、tasks.json的作用及实例
文章目录 launch.json是什么作用多环境调试简单实例进阶使用核心配置项解析调试第三方程序 launch.json是什么 顾名思义:它是在.vscode文件夹下的launch.json,所以是vscode启动调试的配置文件。总结:通过定义调试参数、环境变量和启动方式&a…...
UI自动化测试中的元素等待机制解析
目录 一、显式等待机制 二、隐式等待机制 三、强制等待机制 等待策略对比指南 在UI自动化测试中,元素定位失败通常由两种原因导致:页面存在iframe框架或未合理设置等待机制。本文重点解析三种等待策略及其应用场景。 一、显式等待机制 核心原理 通过…...

VScode编译调试debug,gpu的cuda程序,Nsight
进行下面操作的前提是,我们的环境已经能跑简单的CUDA程序了。 一、安装Nsight 二、创建launch.json文件 {"version": "0.2.0","configurations": [{"name": "CUDA C: Launch","type": "cuda-gdb…...

中企出海大会|打造全球化云计算一张网,云网络助力中企出海和AI创新
全球化是阿里云的长期战略,未来阿里云将持续加大云和 AI 基础设施建设投入。首先是加速打造全球化的云计算网络,一张具备 AI技术服务能力和全球竞争力的云计算网络是阿里云的长期目标。 —— 阿里巴巴集团 CEO、阿里云智能集团董事长兼 CEO 吴泳铭 5 月 …...
qwen-0.5b小模型的用处和显存要求
详细分析一下 Qwen-0.5B (5亿参数) 这个模型在不同训练阶段的显存需求以及它的用途。(根据网页反馈:1、0.5b做蒸馏,特定领域轻松超越sft的7b;2、大部分实时要求高的业务需要用小模型初筛降量,比如意图识别;…...

防范DDoS攻击,服务器稳定性崩溃的根源与高效防御对策
DDoS攻击(分布式拒绝服务攻击)已成为危害服务器稳定性和业务连续性的主要因素之一。本文将深入探讨为什么服务器一遇到DDoS攻击就崩溃,以及如何从根本上实现有效防御和应对这一威胁,帮助企业提升网络安全水平。 具体内容如下&…...

深入理解 SELinux:通过 Nginx 和 SSH 服务配置实践安全上下文与端口策略
目录 一、引言 二、实验环境说明 三、实验 1:Nginx 服务安全上下文配置 3.1 实验目标 3.2 操作步骤 1. 开启 SELinux 并重启系统 2. 安装 Nginx 并创建自定义目录 3. 配置 Nginx 指向自定义目录 4. 分析 SELinux 上下文冲突 5. 修改上下文为合法类型 6. 验…...

C++ —— STL容器——string类
1. 前言 本篇博客将会介绍 string 中的一些常用的函数,在使用 string 中的函数时,需要加上头文件 string。 2. string 中的常见成员函数 2.1 初始化函数 string 类中的常用的初始化函数有以下几种: 1. string() …...

用JS实现植物大战僵尸(前端作业)
1. 先搭架子 整体效果: 点击开始后进入主场景 左侧是植物卡片 右上角是游戏的开始和暂停键 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevic…...
Rust Mock 工具
Rust Mock 工具 Mock(模拟)是测试中不可或缺的工具,用来替代复杂或不可控的依赖,比如数据库、网络服务等,帮助我们写出高质量、健壮的测试代码。Rust 社区中,mockall 和 mockito 是两款主流且强大的 Mock …...
C++读写锁以及实现方式
文章目录 【C专题】读写锁(Reader-Writer Lock)原理与实现方式(含C11/20实践)一、读写锁核心概念1. **什么是读写锁?**2. **读写锁 vs 互斥锁** 二、C中的读写锁实现方式 方案一:POSIX 读写锁(p…...

Electron-vite【实战】MD 编辑器 -- 文件列表(含右键快捷菜单,重命名文件,删除本地文件,打开本地目录等)
最终效果 页面 src/renderer/src/App.vue <div class"dirPanel"><div class"panelTitle">文件列表</div><div class"searchFileBox"><Icon class"searchFileInputIcon" icon"material-symbols-light:…...

华为云Flexus+DeepSeek征文|华为云Flexus云服务器X实例上部署Dify:打造高效的开源大语言模型应用开发平台
目录 前言 1 Dify与华为云部署概述 1.1 什么是 Dify 1.2 华为云与 Flexus 云服务器的优势 2 云服务器部署 Dify 的步骤详解 2.1 模板选择 2.2 参数配置 2.3 资源栈设置 2.4 确认部署信息并执行 3 部署成功后的操作与平台使用指南 3.1 访问平台 3.2 设置管理员账号 …...
[git每日一句]Your branch is up to date with ‘origin/master‘
这句话是 Git 版本控制系统的提示信息,意思是: "你当前所在的分支已经与远程仓库(origin)的 master 分支同步,没有需要推送的提交。" 详细解释: Your branch - 指你当前所在的本地分支 is up …...

高密爆炸警钟长鸣:AI为化工安全戴上“智能护盾”
一、高密爆炸:一声巨响,撕开化工安全“伤疤” 2025年5月27日,山东高密友道化学有限公司的车间爆炸声,像一把利刃划破了化工行业的平静。剧烈的冲击波将车间夷为平地,黑色蘑菇云腾空而起,刺鼻的化学气味弥漫…...

机器人学基础——正运动学(理论推导及c++实现)
机器人正运动学 机器人正运动学一般是指从机器人的关节位置到基于参考坐标系下末端执行器的位置。 平移变换和旋转变换 平移变换 假设我们有两个坐标系A和B,坐标系A与B的方位相同,xyz轴的指向都是一致的,即没有旋转变换。有一点p…...

[网页五子棋][对战模块]处理连接成功,通知玩家就绪,逻辑问题(线程安全,先手判定错误)
文章目录 处理连接成功通知玩家就绪逻辑图问题 1:线程安全问题 2:先手判定错误两边都是提示:轮到对方落子 处理连接成功 实现 GameAPI 的 afterC…...
TensorFlow Extended (TFX) 生产环境模型版本控制与回滚实战指南
TFX 版本控制核心架构 TFX 通过以下组件构建完整的模型生命周期管理系统: ML Metadata (MLMD):记录所有实验和管道的元数据Pusher 组件:负责模型部署与版本标记Model Registry:集中式模型存储库&#x…...

【Web应用】若依框架:基础篇11功能详解-系统接口
文章目录 ⭐前言⭐一、课程讲解⭐二、自己动手实操⭐总结 标题详情作者JosieBook头衔CSDN博客专家资格、阿里云社区专家博主、软件设计工程师博客内容开源、框架、软件工程、全栈(,NET/Java/Python/C)、数据库、操作系统、大数据、人工智能、工控、网络、…...