讲师中心 微信公众号
AI工具推荐 视频效率加速

Spring Boot 项目中 servlet-api 版本冲突的彻底解决方案

千强大大_8416

千强大大_8416

发布时间:2025-12-31 13:34:34

|

642人浏览过

|

来源于php中文网

原创

Spring Boot 项目中 servlet-api 版本冲突的彻底解决方案

本文详解如何定位并修复 gradle 构建中因多版本 `javax.servlet-api`(尤其是旧版 2.5)与 tomcat 9+ 不兼容导致的 `getvirtualservername()` 方法缺失异常。

在 Spring Boot 应用中使用嵌入式 Tomcat(如 tomcat-embed-core-9.0.62)时,若 classpath 中混入了 Servlet 2.5(如 servlet-api-2.5-6.1.14.jar 或 servlet-api-2.5-20081211.jar),就会触发典型的 “method not found” 运行时错误——因为 ServletContext.getVirtualServerName() 是从 Servlet 3.1 规范(JSR 340)起才引入的方法,而 Servlet 2.5 完全不包含该 API。

错误日志明确指出:类加载器优先加载了 servlet-api-2.5-6.1.14.jar 中的 ServletContext,导致 Tomcat 9 调用其内部方法时失败。根本原因并非缺少依赖,而是高版本 Servlet 实现被低版本 jar 包污染覆盖。

✅ 正确解决路径:精准排除 + 显式声明 + 依赖树验证

1. 定位污染源(关键!)

你已发现 org.apache.hadoop:hadoop-core:1.2.1 是罪魁祸首(它强制传递引入了 servlet-api:2.5)。但注意:Gradle 的 configurations.all { exclude ... } 是全局排除,易误伤;更可靠的方式是对症下药,只排除问题模块的传递依赖:

dependencies {
    // 排除 hadoop-core 传递进来的 servlet-api 2.5
    implementation('org.apache.hadoop:hadoop-core:1.2.1') {
        exclude group: 'javax.servlet', module: 'servlet-api'
        exclude group: 'tomcat', module: 'servlet-api' // 兼容旧命名
    }

    // 显式声明受控的、兼容的 Servlet API(provided,避免打包)
    providedRuntime 'javax.servlet:javax.servlet-api:4.0.1'
}
⚠️ 注意:providedRuntime(Gradle 6.8+ 推荐用 compileOnly + runtimeOnly 组合)确保该 API 仅在编译和运行时可用,不会被打包进 BOOT-INF/lib/,从而避免与 Spring Boot 自带的 Tomcat 嵌入式依赖冲突。

2. 强制统一版本(防御性措施)

即使排除了旧依赖,仍建议通过 resolutionStrategy 锁定所有 javax.servlet 相关模块为安全版本:

Expanso json-flatten
Expanso json-flatten

通过 CLI 或 MCP 服务器,使用 Expanso Edge 管道扁平化嵌套 JSON 对象。

下载
configurations.all {
    resolutionStrategy {
        force 'javax.servlet:javax.servlet-api:4.0.1'
        // 同时 force 其他可能变体(如 jakarta.*,若升级到 Servlet 5.0+)
        // force 'jakarta.servlet:jakarta.servlet-api:5.0.0'
    }
}

3. 验证依赖树(必做!)

执行以下命令确认旧版 servlet-api 已彻底移除:

./gradlew dependencies --configuration runtimeClasspath | grep -i "servlet-api"

输出中应仅出现 javax.servlet-api:4.0.1 和 tomcat-embed-core 自带的 ServletContext(它已内含兼容实现),且无任何 servlet-api-2.5* 条目。

4. 补充说明:为什么 exclude group: '', module: 'servlet-api' 失败?

该写法中的空 group 会匹配所有组名为空的模块(极罕见),而实际 servlet-api-2.5 的 group 通常是 tomcat 或 javax.servlet。未指定 group 导致排除失效或误排除,务必显式声明 group 和 module。

✅ 最佳实践总结

  • ❌ 不要依赖 configurations.all { exclude } 全局清理;
  • ✅ 对污染源(如 hadoop-core)做精准 exclude;
  • ✅ 显式声明 javax.servlet-api:4.0.1+ 并使用 providedRuntime(Spring Boot 2.x/3.x)或 compileOnly(Gradle 新版);
  • ✅ 用 resolutionStrategy.force 加双保险;
  • ✅ 每次修改后必跑 dependencies 任务验证;
  • ? 若项目需升级 Hadoop,优先考虑 hadoop-client:3.3.6+(已弃用 Servlet 2.5,兼容 Servlet 3.1+)。

遵循以上步骤,即可一劳永逸解决 ServletContext.getVirtualServerName() 缺失引发的容器启动崩溃问题。

热门AI工具

更多
音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

相关专题

更多
如何配置Tomcat环境变量
如何配置Tomcat环境变量

配置Tomcat环境变量需要在系统中添加CATALINA_HOME变量,并将Tomcat的安装路径添加到PATH变量中。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

865

2023.10.26

idea如何集成Tomcat
idea如何集成Tomcat

idea集成Tomcat的步骤:1、添加Tomcat服务器配置;2、配置项目部署;3、运行Tomcat服务器;4、访问项目;5、注意事项;6、关闭Tomcat服务器。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

304

2024.02.23

怎么查看Tomcat源代码
怎么查看Tomcat源代码

查看Tomcat源代码的步骤:1、下载Tomcat源代码;2、在IDEA中导入Tomcat源代码;3、查看源代码;4、理解Tomcat的工作原理;5、参与社区和贡献;6、注意事项;7、持续学习和更新;8、使用工具和插件。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

489

2024.02.23

常见的tomcat漏洞有哪些
常见的tomcat漏洞有哪些

常见的tomcat漏洞有:1、跨站脚本攻击;2、跨站请求伪造;3、目录遍历漏洞;4、缓冲区溢出漏洞;5、配置漏洞;6、第三方组件漏洞。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

305

2024.02.23

tomcat日志乱码怎么解决
tomcat日志乱码怎么解决

tomcat日志乱码的解决办法:1、修改tomcat的日志编码设置;2、检查ide的编码设置;3、检查操作系统的编码设置;4、使用过滤器处理日志;5、检查外部系统的编码设置;6、检查文件编码方式等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

348

2024.02.23

weblogic和tomcat有哪些区别
weblogic和tomcat有哪些区别

weblogic和tomcat的区别:1、功能;2、性能;3、规模;4、价格;5、安全性;6、配置和管理;7、社区支持;8、集成能力;9、升级和更新;10、可靠性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

349

2024.02.23

tomcat和nginx有哪些区别
tomcat和nginx有哪些区别

tomcat和nginx的区别:1、应用领域;2、性能;3、功能;4、配置;5、安全性;6、扩展性;7、部署复杂性;8、社区支持;9、成本;10、日志管理。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

601

2024.02.23

tomcat启动闪退怎么解决
tomcat启动闪退怎么解决

tomcat启动闪退的解决办法:1、检查java环境;2、检查环境变量配置;3、检查端口被占用;4、检查配置文件编码;5、检查启动时需要的配置文件;6、检查相关文件是否丢失;7、检查防火墙和杀毒软件设置。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

322

2024.02.23

Vite 项目如何打包和部署
Vite 项目如何打包和部署

Vite项目打包部署专题汇集生产构建、产物预览、输出目录、资源路径、Nginx与GitHub Pages部署及常见白屏和路由404问题的已审核文章,帮助读者完成上线流程。

60

2026.10.28

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
dev.java 官方:Learn Java
dev.java 官方:Learn Java

共0课时 | 0人学习

Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn