升级Micronaut至3.4.0及更高版本触发java.lang.VerifyError求助
问题背景
当前技术栈:Micronaut 3.3.3,搭配micronaut-application/library 3.2.1、Micronaut Data Processor 3.2.2,Java 11,多模块Gradle结构。升级Micronaut至3.4.0或最新3.6.1(未同步升级其他依赖)时,触发以下错误:
Caused by: java.lang.VerifyError: Bad type on operand stack
Exception Details:
Location:
insurance/$InsuranceContract$Introspection.dispatch(ILjava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object; @28: invokevirtual
Reason:
Type 'insurance/$InsuranceContract$Introspection' (current frame, stack[1]) is not assignable to 'io/micronaut/context/AbstractExecutableMethodsDefinition'
Current Frame:
bci: @28
flags: { }
locals: { 'insurance/$InsuranceContract$Introspection', integer, 'java/lang/Object', '[Ljava/lang/Object;' }
stack: { 'java/lang/Object', 'insurance/$InsuranceContract$Introspection', integer }
Bytecode:
核心原因与排查方向
- 依赖版本不兼容:Micronaut 3.4.0及之后版本对内部的Introspection类生成逻辑做了调整,旧版本的micronaut-application/library、Data Processor与新版本核心库不匹配。必须保证所有Micronaut相关依赖(核心、application、data processor等)使用同一主版本,比如升级到3.6.1时,所有依赖都要切换到3.6.x系列,不能混用3.2.x的旧依赖。
- 编译缓存残留:Gradle的编译缓存可能保留了旧版本注解处理器生成的
$InsuranceContract$Introspection这类字节码文件,新版本核心加载时出现类型校验失败。执行清理命令彻底重建:
也可以手动删除各模块的./gradlew clean build --no-build-cachebuild目录和项目根目录的.gradle缓存文件夹。 - 多模块依赖冲突:多模块结构中可能存在子模块未同步升级依赖,导致类路径中同时存在新旧版本的Micronaut类。用Gradle命令检查依赖树,定位冲突依赖并强制统一版本:
在根项目的./gradlew dependenciesbuild.gradle中用resolutionStrategy强制所有Micronaut相关依赖的版本:allprojects { configurations.all { resolutionStrategy { force 'io.micronaut:micronaut-core:3.6.1' force 'io.micronaut:micronaut-application:3.6.1' force 'io.micronaut.data:micronaut-data-processor:3.6.1' // 其他相关依赖同理 } } } - 编译参数配置问题:确保编译参数符合Micronaut要求,尤其是Java版本和参数传递。在根项目
build.gradle中配置:
注意:升级到Java17时,Gradle版本需至少为7.3,避免兼容问题。plugins { id "io.micronaut.application" version "3.6.1" // 插件版本也要同步 } tasks.withType(JavaCompile) { options.release = 11 // 对应使用的Java版本,Java17则改为17 options.compilerArgs.add("-parameters") // Micronaut注解处理器需要此参数 }
内容的提问来源于stack exchange,提问作者Akshay

