Мы используем последние версии 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
- understanding-how-to-resolve-inconsistent-stackmap-frames-exception
- java-7-inconsistent-stackmap-frames-need-help-understanding-why-solution-wor
Из того, что я понял, это то, что java 7 использует более строгую проверку и вводит карту стека для классов для проверки кода. Так почему-то во время моего процесса обфускации эта карта, похоже, повреждена, поскольку происходит только это исключение, когда я запутываю свой проект с помощью proguard.
Отключение проверки с помощью -XX: -UseSplitVerifier и запуск встроенного баннера помогает, но im не совсем уверен, должно ли это быть способ решения этой проблемы.
Итак, интересно, кто-то еще имел симулятивную ошибку? Или, если кто-то может даже знать конкретный способ решить эту проблему, например, отрегулировав конфигурацию proguard для процесса обфускации?