Spring Boot DevTools RestartClassLoader类转换异常如何排除指定类?
异常截图:
问题根因说明
Spring Boot DevTools 采用双类加载器机制加速项目重启:基础类加载器(app classloader)加载第三方依赖包,RestartClassLoader加载项目内的自定义类。你遇到的ClassCastException是因为CachedResponse类同时被两个类加载器加载,JVM判定不同类加载器加载的同全限定名类不属于同一类型,强转时直接抛出异常。
你之前的配置存在两个问题:一是restart.exclude.classes是DevTools内部属性,直接指定整个类文件路径会排除所有项目类,导致重启功能完全失效;二是单独指定类不生效是因为配置的键名、路径格式不符合官方规范。
可用解决方案
方案1:应用配置文件直接排除
在项目的application.properties/application.yml中添加配置,精确指定要排除的类:
# 路径为类路径下的类文件路径,用斜杠分隔,多个类用逗号分隔 spring.devtools.restart.additional-exclude=xxx/api/cache/CachedResponse.class
如果需要排除整个包下的类,可使用通配符:
spring.devtools.restart.additional-exclude=xxx/api/cache/**/*
方案2:自定义DevTools专属配置(优先级更高)
如果方案1不生效,在项目src/main/resources/META-INF目录下新建spring-devtools.properties文件,添加如下配置:
# 前缀可自定义,值为目标类的类路径路径,明确指定该类不由RestartClassLoader加载 restart.exclude.cached-response=xxx/api/cache/CachedResponse.class
方案3:兼容兜底方案
如果以上配置都不生效,可以将CachedResponse类单独抽离为独立Jar模块,作为第三方依赖引入到当前项目。DevTools默认不会用RestartClassLoader加载第三方Jar内的类,天然规避类加载冲突。
内容的提问来源于stack exchange,提问作者try_harder
相关产品推荐
相关产品推荐


