0

0

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

霞舞

霞舞

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

|

542人浏览过

|

来源于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 相关模块为安全版本:

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 已彻底移除:

Endel.io
Endel.io

Endel是一款可以创造个性化舒缓声音的应用程序,可帮助您集中注意力、放松身心和入睡。

下载
./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() 缺失引发的容器启动崩溃问题。

相关专题

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

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

113

2023.10.26

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

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

164

2024.02.23

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

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

94

2024.02.23

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

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

159

2024.02.23

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

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

149

2024.02.23

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

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

197

2024.02.23

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

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

222

2024.02.23

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

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

154

2024.02.23

vlookup函数使用大全
vlookup函数使用大全

本专题整合了vlookup函数相关 教程,阅读专题下面的文章了解更多详细内容。

28

2025.12.30

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 2.1万人学习

C# 教程
C# 教程

共94课时 | 5.7万人学习

Java 教程
Java 教程

共578课时 | 39.8万人学习

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

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号