Java 8运行时遇ClassFormatError:StackMapTable格式错误求助
搞定Java 8u162里的
java.lang.ClassFormatError: StackMapTable format error问题 你碰到的这个运行时错误确实挺棘手的,我结合Java 8的字节码规范和常见问题场景,整理了几个可行的排查方向,你可以试试:
先确认编译与运行环境的匹配性
虽然你用的是Java 8u162运行程序,但得检查编译com.internal.connection.g这个类的JDK版本是不是和运行版本一致。如果是用Java 9及以上版本编译的,哪怕加了-source 1.8,没指定-target 1.8和-bootclasspath的话,生成的字节码里的StackMapTable结构可能和Java 8u162不兼容。建议直接用Java 8u162的JDK重新编译这个类,带上这些参数:javac -source 1.8 -target 1.8 -bootclasspath $JAVA_HOME/jre/lib/rt.jar com/internal/connection/g.java排查字节码增强或混淆工具的锅
如果你的项目用了AspectJ、CGLIB这类字节码增强工具,或者ProGuard混淆工具,它们在修改字节码的时候可能不小心破坏了StackMapTable的格式。可以先临时关掉这些工具,重新打包运行试试:- 如果错误消失了,那就是工具的问题,要么升级到支持Java 8u162的最新版本,要么调整工具的配置(比如ProGuard可以加
-dontpreverify跳过预校验,但这只是临时方案,建议优先升级)
- 如果错误消失了,那就是工具的问题,要么升级到支持Java 8u162的最新版本,要么调整工具的配置(比如ProGuard可以加
修复可能损坏的类文件
说不定com/internal/connection/g.class这个文件本身已经损坏了。可以试试:- 彻底清理项目的构建缓存(比如Maven的
target、Gradle的build目录),然后重新构建整个项目 - 从源码重新编译这个类,替换掉原来的类文件
- 彻底清理项目的构建缓存(比如Maven的
试试升级Java 8的小版本
Java 8u162是2018年的版本了,后续的小版本(比如u201、u301)修复了不少字节码校验相关的bug。升级到Java 8的最新稳定版,说不定就能绕过这个StackMapTable的校验错误。
顺便说下,这个错误是JVM在验证字节码时,发现目标方法的StackMapTable里类型数组的大小不符合规范导致的,一般都是字节码生成或修改环节出了问题。
内容的提问来源于stack exchange,提问作者datasert




