Java 8:期望在分支目标65处有一个堆栈映射帧



使用jdk 1.8.0_51源= 1.7,目标= 1.7Junit 4.6, ant 1.8.0

发生了什么事?
所有以1.7通过的测试现在都失败了。我需要知道以下内容:

    为什么会发生这种情况?
  1. 是否有像-XX:-UseSplitVerifier(java 1.7)这样的选项
  2. 如何找出问题的根源?
  3. 解决这个问题的步骤是什么?

我们有构建、部署和测试的目标。
构建和部署工作正常,没有问题,但所有模块的Junit测试都失败了。
我尝试升级ant(1.8.9), junit 4.10。
这可能是因为任何没有用java 1.8编译的jar吗?
我应该确保我使用的所有jar都是用java8编译的吗?如果是的话,这可能是一个不好的信号:(



我试着通过命令提示符运行junit,它工作了。java -cp ./target/package-test:./target/mycompany-common.jar:./lib/junit-4.6.jar org.junit.runner.JUnitCore com.mycompany.JunitTest <>之前=====================================================================================测试:1批次:1线程:1主持人:远程=====================================================================================测试运行失败错误跳过持续时间JunitTest 1 0.068秒-------------------------------------------------------------------------------------总计1 1=====================================================================================以下测试出现失败或错误:com.mycompany.JunitTest失败和错误可以在以下文件中看到://报告/junit目标/TEST-com.mycompany.JunitTest.txt第一次测试失败的结果:Testsuite: com.mycompany.JunitTest测试运行:1、失败:0、错误:1、运行时间:0.068秒Testcase:测试耗时0.018秒导致错误在分支目标65处等待堆栈映射帧异常详细信息:地点:com/mycompany/Identifier.equals (Ljava/lang/对象;我很好原因:期望的堆栈映射帧在这个位置。字节码:0x0000000: 033d 11ff ff3e 1215 1100 35b8 001b 2bc10x0000010: 0002 1100 353d 1100 003e 9a00 271c 11000x0000020: 35a0 0016 1d11 0000 a000 0f12 151c 1d040x0000030: b800 4111 FFFF 3e12 1511 0036 b800 1b030x0000040: ac1d 9b00 0f12 151c 1d03 b800 4111 FFFF0x0000050: 3e12 1511 0039 b800 12b2b c000 023a 04120x0000060: 1511 003a b800 1b2a b400 2619 04b4 00260x0000070: b600 43acStackmap表:same_frame_extended (@89)java.lang.VerifyError:期望分支目标65的堆栈映射帧异常详细信息:地点:com/mycompany/Identifier.equals (Ljava/lang/对象;我很好原因:期望的堆栈映射帧在这个位置。字节码:0x0000000: 033d 11ff ff3e 1215 1100 35b8 001b 2bc10x0000010: 0002 1100 353d 1100 003e 9a00 271c 11000x0000020: 35a0 0016 1d11 0000 a000 0f12 151c 1d040x0000030: b800 4111 FFFF 3e12 1511 0036 b800 1b030x0000040: ac1d 9b00 0f12 151c 1d03 b800 4111 FFFF0x0000050: 3e12 1511 0039 b800 12b2b c000 023a 04120x0000060: 1511 003a b800 1b2a b400 2619 04b4 00260x0000070: b600 43acStackmap表:same_frame_extended (@89)在com.mycompany.JunitTest.test (JunitTest.java: 17)

从Java 8开始,没有等效的——usesplitverifier

  1. 您可以使用'-noverify'来阻止java 8以严格的字节码实现模式编译代码。

  2. 如果使用Eclipse,您还可以执行windows->preferences->compiler ->取消选中"保留未使用的局部变量"选项

在将应用程序从1.6迁移到1.7时,我也面临同样的挑战,但我能够解决它。

方法1:你可以使用-XX:-UseSplitVerifier参数来解决这个问题,你不需要担心升级库文件。

方法2:我按照以下步骤来解决问题:

    确定并保存应用程序使用的外部库的列表。
  1. 一旦你确定了列表,继续删除一个接一个的外部库文件,并插入升级版本的库文件,这将帮助你隔离可能导致问题的库。在我的情况下:j2ee.jar和openjpa-1.2.2 jar文件创建了一个问题,然后我升级了这些库,它们已经解决了迁移问题。
找出是哪个库导致了这个问题,并阻止它,这是一个缓慢而痛苦的过程。

我在从Java 1.7升级到1.8时遇到了类似的问题。当运行Parasoft Jtest单元测试用例时,我得到了"期望分支目标12的堆栈映射框架"错误。这个问题是通过在Eclipse中的JRE定义中添加[-noverify] VM参数来解决的。

相关内容

  • 没有找到相关文章

最新更新