我们正在使用最新的 JDK 7 (u45) 和 ProGuard 版本 4.10
最近开始我们的分发失败,在混淆它之后,出现以下错误:
Exception in thread "main" java.lang.VerifyError: Expecting a stackmap frame at
branch target 155
Exception Details:
Location:
com/bla/bla/service/ioc/SpringBootstrap.c()V @0: getstatic
Reason:
Expected stackmap frame at this location.
Bytecode:
0000000: b200 73b6 008b 9900 82b2 0073 b800 933b
0000010: 1a99 0074 b200 73b6 008d 9900 6bb2 0074
0000020: 1221 b600 cfb8 0092 4c2b b600 9c12 1db9
...
Exception Handler Table:
bci [0, 152] => handler: 155
at java.lang.Class.getDeclaredMethods0(Native Method)
at java.lang.Class.privateGetDeclaredMethods(Unknown Source)
at java.lang.Class.getMethod0(Unknown Source)
at java.lang.Class.getMethod(Unknown Source)
at sun.launcher.LauncherHelper.getMainMethod(Unknown Source)
at sun.launcher.LauncherHelper.checkAndLoadMain(Unknown Source)
我在 StackOverflow 上发现了几个关于这个主题的讨论,比如
- java-lang-verifyerror-expecting-a-stackmap-frame-at-branch-target-jdk-1-7
- java-lang-verifyerror-expecting-a-stackmap-frame
- 了解如何解决不一致的堆栈图帧异常
- java-7-inconsistent-stackmap-frames-需要帮助-理解-为什么-解决方案-wor
据我了解,Java 7 使用了更严格的验证,并为类引入了堆栈映射来验证代码。所以在我的混淆过程中,这个地图似乎被破坏了,因为只有这个异常发生,当我用 proguard 混淆我的项目时。
使用-XX:-UseSplitVerifier禁用验证并启动构建的 jar 会有所帮助,但我不确定这是否应该是处理此问题的方法。
所以我想知道是否还有其他人有类似的错误?或者是否有人甚至可能知道解决此问题的特定方法,例如通过调整混淆过程的 proguard 配置?