Tomcat 9.0.37版本缓存依赖失效(9.0.20正常)伴随Spring Bean创建异常
问题根因定位
你遇到的报错核心是ParallelWebappClassLoader无法完成TaxLotsServiceImpl的类自省,本质是该类依赖的缓存相关类在Tomcat 9.0.37+的新类加载规则下无法被正常加载,可按照如下步骤定位具体原因:
- 服务启动时添加JVM参数
-verbose:class,过滤com.frk.fds和缓存组件(如Spring Cache、Ehcache、Redis客户端等)的类加载日志,确认是否存在类加载失败、找不到对应类的记录。 - 核对Tomcat官方变更记录:9.0.37版本默认开启了
ParallelWebappClassLoader的并行类加载能力,同时收紧了Web应用类加载器对父加载器资源的访问权限,该改动会直接影响依赖反射扫描类元数据的Spring容器初始化流程。 - 检查项目Spring框架版本:如果Spring核心版本低于5.2.10.RELEASE、Spring Boot版本低于2.3.4.RELEASE,会存在和Tomcat新并行类加载器的兼容性bug,旧版本Spring的类自省逻辑无法适配
ParallelWebappClassLoader的并发类加载机制,导致扫描TaxLotsServiceImpl的方法元数据时失败。 - 检查缓存依赖的scope配置:如果缓存相关依赖的scope被设为
provided,Tomcat新版本下父加载器默认不会加载该类,会直接导致应用类加载时找不到依赖类。
解决方案
可根据项目实际情况选择以下任意一种方案修复:
- 方案1(适配速度最快,无需修改业务代码/依赖):在应用的
META-INF/context.xml中添加如下配置,关闭当前应用的并行类加载能力,回退到9.0.20版本的类加载逻辑:
<Context> <Loader parallelClassLoading="false" /> </Context>
如果需要全局生效,可直接修改Tomcat安装目录下的conf/context.xml添加上述配置。
- 方案2(一劳永逸修复兼容性问题):将Spring核心版本升级到
5.2.10.RELEASE及以上,Spring Boot版本升级到2.3.4.RELEASE及以上,该版本已经官方修复了和Tomcat 9.0.37+类加载器的兼容性问题。 - 方案3(修正依赖配置错误):检查所有缓存相关依赖的包管理配置,将scope从
provided改为默认的compile(Maven)或者implementation(Gradle),确保缓存相关类会被打包到应用的WEB-INF/lib目录下,能被Web应用类加载器正常加载。
内容的提问来源于stack exchange,提问作者user3582545
相关产品推荐
相关产品推荐

