我们正在使用最新的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 7使用了更严格的验证,并为类引入了一个堆栈映射来验证代码。因此,在我的混淆过程中,这个映射似乎被破坏了,因为只有这个异常发生了,当我用project混淆我的项目时。
禁用-XX:-UseSplitVerifier验证并启动构建的jar会有所帮助,但我不确定这是否应该是处理此问题的方式。
所以我想知道是否还有其他人犯了模拟错误?或者,如果有人可能知道解决这一问题的具体方法,例如,为混淆过程调整前护卫配置?
发布于 2013-11-12 19:13:36
我假设您没有指定-dontpreverify?该选项几乎肯定会导致这些错误,因为它将阻止ProGuard更新StackMapTable属性。该属性在Java 6中是可选的,但在Java 7中是必需的。
您仍然可以尝试ProGuard 4.11的测试版,但在这里不太可能有什么不同。如果你把处理过的类文件寄给我,我会调查的。
(我是ProGuard的开发人员)
发布于 2016-01-05 11:25:52
如果你们还没有找到解决方案,你们可以试着检查一下你们是否有-microedition选项。下面是为什么它与StackMap有关。删除这个选项为我解决了这个问题。
发布于 2016-06-09 22:57:37
在将应用程序从1.6迁移到1.7时,我也面临着同样的挑战。经过巨大的斗争,我们找到了解决这个问题的办法。
方法1:您可以使用-XX:-UseSplitVerifier参数来解决这个问题,您不需要担心升级库文件。
方法2:我遵循了以下步骤来解决这个问题。步骤1:确定并保存应用程序使用的外部库列表。步骤2:确定列表后,继续逐个删除外部库文件,并插入升级版本库文件,这将帮助您隔离可能导致问题的库。在我的例子中: j2ee.jar和openjpa-1.2.2 jar文件创建了一个问题,然后我升级了这些库,解决了迁移问题。
因此,找出引起问题的图书馆并逮捕它是一个缓慢而痛苦的过程。
我希望,这些信息可能是有用的,因为它是基于我的实时经验。
https://stackoverflow.com/questions/19928927
复制相似问题