You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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),减少依赖冲突引发的字节码异常

验证步骤

  1. 移除JVM参数-Xverify:none
  2. 应用上述任一方案后,通过Jenkins重新部署
  3. 检查Bean创建流程是否正常,验证AppStatusController的功能完整性

内容的提问来源于stack exchange,提问作者Harshith Jain

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 22:05:42