Spring升级后部署触发VerifyError,求非Xverify:none解决方案
Spring 4.3.20升级至5.3.20后Jenkins部署触发VerifyError的解决方案
问题背景
- 环境配置:Spring 5.3.20、Hibernate 5.2.3.Final、Java 11、Tomcat 9
- 异常现象:本地编译运行无异常,Jenkins部署至服务器时,Bean创建阶段抛出
VerifyError,可通过JVM参数-Xverify:none绕过,但需无需该参数的根治方案 - 核心错误堆栈:
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'appStatusController': Lookup method resolution failed; nested exception is java.lang.IllegalStateException: Failed to introspect Class [com.officehours.controller.AppStatusController] from ClassLoader [ParallelWebappClassLoader context: stage delegate: false -----------> Parent Classloader: java.net.URLClassLoader@2436ea2f] at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor .determineCandidateConstructors(AutowiredAnnotationBeanPostProcessor.java:289) .... ..... Caused by: java.lang.VerifyError: Inconsistent stackmap frames at branch target 1285 Exception Details: Location: com/officehours/controller/AppStatusController.appOk(Ljavax/servlet/http/HttpServletRequest;Ljavax/servlet/http/HttpServletResponse;)Lorg/springframework/web/servlet/ModelAndView; @1282: goto Reason: Current frame's stack size doesn't match stackmap. Current Frame: bci: @1282 flags: { } locals: { 'com/officehours/controller/AppStatusController', 'javax/servlet/http/HttpServletRequest', 'javax/servlet/http/HttpServletResponse', 'com/newrelic/agent/bridge/ExitTracer', integer, null, top, top, top, top, top, top, 'javax/servlet/http/HttpServletResponse', 'javax/servlet/http/HttpServletRequest', 'com/officehours/controller/AppStatusController', integer, 'org/springframework/web/servlet/ModelAndView', top, top, top, top, top, 'java/lang/Throwable', 'javax/servlet/http/HttpServletResponse', 'javax/servlet/http/HttpServletRequest', 'com/officehours/controller/AppStatusController', 'java/io/File', 'java/io/LineNumberReader', top, top, 'org/springframework/web/servlet/ModelAndView', 'org/springframework/web/servlet/ModelAndView' } stack: { 'org/springframework/web/servlet/ModelAndView' } Stackmap Frame: bci: @1285 flags: { } locals: { 'com/officehours/controller/AppStatusController', 'javax/servlet/http/HttpServletRequest', 'javax/servlet/http/HttpServletResponse', 'com/newrelic/agent/bridge/ExitTracer', integer, null, top, top, top, top, top, top, 'javax/servlet/http/HttpServletResponse', 'javax/servlet/http/HttpServletRequest', 'com/officehours/controller/AppStatusController', integer, 'org/springframework/web/servlet/ModelAndView', top, top, top, top, top, top, 'javax/servlet/http/HttpServletResponse', 'javax/servlet/http/HttpServletRequest', 'com/officehours/controller/AppStatusController', 'java/io/File', 'java/io/LineNumberReader', top, top, 'org/springframework/web/servlet/ModelAndView', 'org/springframework/web/servlet/ModelAndView' } stack: { 'org/springframework/web/servlet/ModelAndView','org/springframework/web/servlet/ModelAndView' }
错误根源分析
从堆栈信息可明确:
- 异常由JVM字节码验证失败导致,具体是栈映射表(stackmap)与实际栈帧的元素数量不匹配
- 错误位置涉及
com.newrelic.agent.bridge.ExitTracer,说明是NewRelic代理对AppStatusController.appOk()方法做字节码增强时,生成的字节码不符合Java 11的验证规范 - 本地运行正常是因为本地未启用NewRelic代理,或代理版本与服务器存在兼容性差异;Jenkins部署时服务器启用了代理,触发验证失败
解决方案
1. 升级NewRelic代理版本
旧版NewRelic代理对Java 11、Spring 5.x的字节码增强支持存在缺陷,升级至支持Java 11的最新稳定版(如8.x及以上版本),可修复栈帧不匹配的问题。
2. 排除特定类/方法的NewRelic增强
若暂时无法升级代理,可在NewRelic配置文件newrelic.yml中添加排除规则,跳过对目标类/方法的字节码修改:
class_transformer: exclude_classes: - com.officehours.controller.AppStatusController exclude_methods: - com/officehours/controller/AppStatusController.appOk(Ljavax/servlet/http/HttpServletRequest;Ljavax/servlet/http/HttpServletResponse;)Lorg/springframework/web/servlet/ModelAndView;
3. 对齐Jenkins与本地的编译环境
- 确认Jenkins构建使用的Java版本、编译参数与本地完全一致,避免因编译环境差异生成不兼容的字节码
- 检查Jenkins是否存在额外的字节码增强插件(如AspectJ、Lombok等),确保插件版本与本地兼容
4. 升级Hibernate版本
当前Hibernate 5.2.3.Final为旧版本,与Spring 5.3.x的兼容性存在隐患,升级至支持Java 11的Hibernate稳定版(如5.4.x或5.6.x),减少依赖冲突引发的字节码异常
验证步骤
- 移除JVM参数
-Xverify:none - 应用上述任一方案后,通过Jenkins重新部署
- 检查Bean创建流程是否正常,验证
AppStatusController的功能完整性
内容的提问来源于stack exchange,提问作者Harshith Jain
相关产品推荐
相关产品推荐

