Spring Boot 1.x升2.x Groovy测试报TypeNotPresentExceptionProxy
核心原因
你遇到的这个编译报错本质是Spring Boot 2.4.4 与当前项目使用的 Groovy、Spock 版本完全不兼容,导致 Groovy 编译器在语义分析阶段直接崩溃:
- 原项目用的 Groovy 2.4.12、Spock 1.2-groovy-2.4 是完全匹配 Spring Boot 1.5.9 版本的依赖组合,Spring Boot 1.5.x 本身绑定的 Groovy 基线就是 2.4.x 系列
- Spring Boot 2.4.4 对应内嵌的 Groovy 基线已经升级到 3.0.x 版本,自带的 Spring Core 5.3.x 对注解元数据的解析规则、类结构定义都做了调整,老版本的 Groovy 2.4.12 编译器根本无法正常识别这些新类结构,解析到你标注的
@SpringBootTest注解引用的相关类时,直接在语义分析阶段触发内部 BUG,抛出TypeNotPresentExceptionProxy代理异常。这个报错信息不会直接点明是 Groovy 版本不匹配,很容易误导排查方向。
可落地的解决步骤
- 在 pom.xml 中显式锁定与 Spring Boot 2.4.4 兼容的 Groovy 版本,替换原有的 groovy-all 2.4.12
- 注意 Groovy 3.0 版本的 groovy-all 打包结构做了调整,需要引入 pom 类型的聚合依赖,不要沿用老版本的单 jar 引入方式
- 同步替换不兼容的 Spock 依赖版本
- 把原有的 spock-core 1.2-groovy-2.4,替换为匹配 Groovy 3.0 系列的 Spock 稳定版本,避免 Spock 与 Groovy 版本错配再次引发编译错误
- 检查 Maven 构建插件的配置
- 确认项目里用于混编 Java、Groovy 的编译插件(如 groovy-eclipse-compiler、maven-compiler-plugin)绑定的 Groovy 版本与依赖版本完全一致,不要让插件自动拉取低版本 Groovy 抢占类路径优先级
- 全量排查类路径的版本残留
- 执行
mvn dependency:tree | grep -i groovy扫描全量传递依赖,只要发现类路径里残留 Groovy 2.4.x 的版本引用,就在对应传递依赖节点上加排除规则,避免双版本共存导致的类加载错乱
- 执行
针对已定位触发点的补充校验
完成版本对齐后,需要确认 MyWebConfigClass 的配置是否符合 Spring Boot 2.4 的规则:
- 检查该类是否保留了
@Configuration注解,所在包路径是否落在 Spring Boot 默认扫描的根路径下,如果类本身无法被正常加载,也会在 Groovy 解析注解引用时触发类找不到的代理异常,这类问题属于版本对齐后才会暴露的次要配置问题,不是触发当前编译崩溃的核心原因。
内容的提问来源于stack exchange,提问作者PainIsAMaster
相关产品推荐
相关产品推荐

