项目场景:
spring boot 项目,在本地启动时不会报错,但是发布到测试环境后,会报 java.lang.VerifyError
问题描述:
java.lang.VerifyError是JVM加载class文件时做字节码校验(bytecode verification)失败时报错的。如果你的class文件是由java源文件通过javac编译出来的,那么基本上不用担心bytecode verification。 如果class文件是由asm、cglib等动态生成出来的或者由其它编译器生成的,那么JVM在校验它的bytecode时就有可能失败。 失败的原因可能是你生成的bytecode有bug,也可能是由于新版本的JVM加入了新的验证条件后导致原来可以通过验证的bytecode现在不能通过了。也可能是asm和cglib的版本冲突导致的
很多Java框架都会动态生成class文件,再加上JVM版本也会时不时地修改它的bytecode verification行为。 所以,运行代码时偶尔会遇到java.lang.VerifyError错误。 在不能修改框架代码或者切换JVM实现的情况下,JVM提供了一些选项可以让你改变或者绕过bytecode verification。
解决方案:
首先检查下项目中是否存在asm和cglib的jar包版本冲突。如果不是则可以通过参数配置,禁止字节码校验。
配置Jvm参数 -noverify。