升级tomcat-embed-core至11.0.3后Spring Boot启动失败,如何解决?
解决Tomcat 11.0.3升级后Spring Boot启动失败的问题
问题原因
Tomcat 11.0.3的JreCompat类通过反射访问java.io.FileSystem.useCanonCaches字段时,触发了JDK17模块系统的权限限制——java.base模块默认不允许未命名模块访问该内部字段,从而抛出InaccessibleObjectException,导致应用启动失败。
解决方案
1. 调整Tomcat版本
- 回退版本:暂时将
tomcat-embed-core回退到11.0.2版本,恢复原有正常运行状态。 - 升级到修复版本:升级至Tomcat 11.0.4及以上版本(官方已修复该JDK17兼容性问题)。
Maven项目可在pom.xml中指定版本:
<properties> <tomcat.version>11.0.4</tomcat.version> </properties>
2. 添加JVM启动参数
若无法调整Tomcat版本,可通过JVM参数开放模块访问权限:
--add-opens java.base/java.io=ALL-UNNAMED
- IDE运行:在Run/Debug配置的VM options中添加该参数。
- 命令行运行:打包后启动时加入参数:
java --add-opens java.base/java.io=ALL-UNNAMED -jar your-application.jar
3. 遵循Spring Boot依赖管理规范
Spring Boot 3.4.2的parent已经内置了经过兼容性测试的Tomcat版本,手动升级Tomcat容易引入版本适配问题。建议优先使用parent管理的依赖版本,避免手动指定Tomcat版本;若需升级,确认目标Tomcat版本与Spring Boot 3.4.2兼容。
内容的提问来源于stack exchange,提问作者Dayananda
相关产品推荐
相关产品推荐

