Java8下Junit测试报Expecting a stackmap frame错误如何解决
问题根源
Verify Expecting a stackmap frame at branch target 99错误本质是低版本 Cobertura 在对 Java 8 字节码插桩时,破坏了字节码中的 StackMapTable 结构,JVM 加载类做字节码校验时匹配不到预期的栈映射帧触发报错。你遇到的Sinus test = new Sinus()只是类加载的触发点,和类本身的业务代码无关。
解决方案
方案1:升级 Cobertura Maven 插件到兼容 Java 8 的版本
- 最低要求升级到
cobertura-maven-plugin2.7及以上版本,该版本开始支持 Java 8 字节码插桩 - pom.xml 中配置参考:
<plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>cobertura-maven-plugin</artifactId> <version>2.7</version> <configuration> <encoding>UTF-8</encoding> </configuration> </plugin>
- 升级后执行
mvn clean cobertura:cobertura重新测试即可
方案2:临时添加 JVM 参数关闭字节码校验(仅测试环境用,不推荐生产用)
如果暂时无法升级插件,可以给 Maven 测试环节添加 JVM 启动参数,跳过 StackMapTable 校验:
- 在 pom.xml 的 maven-surefire-plugin 配置中添加
-noverify参数:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>2.22.2</version> <configuration> <argLine>-noverify</argLine> </configuration> </plugin>
- 也可以执行测试命令时临时指定:
mvn test -DargLine=-noverify
注意:该方案会关闭 JVM 的字节码校验,仅建议本地测试临时使用,不要用到生产环境配置中
方案3:替换为 JaCoCo 代码覆盖率插件(长期推荐)
如果 Cobertura 后续还有其他 Java 8 兼容问题,可以切换为 JaCoCo,该插件对 Java 8 及更高版本的兼容性远优于停止更新的 Cobertura,配置复杂度和覆盖率统计能力均优于 Cobertura。
内容的提问来源于stack exchange,提问作者Undefinedz10
相关产品推荐
相关产品推荐

