Java 8:期望分支目标65处的堆栈图帧

时间:2015-08-23 17:58:45

标签: java ant junit java-8

使用jdk 1.8.0_51 source = 1.7,target = 1.7 Junit 4.6,ant 1.8.0

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

  1. 为什么会这样?
  2. 是否有像-XX这样的选项:-UseSplitVerifier(java 1.7)
  3. 如何找出问题的根本原因?
  4. 解决此问题需要采取哪些步骤?
  5. 我们有构建,部署和测试的目标 构建和部署工作没有问题,但Junit测试在所有模块中都失败了。
    我尝试升级ant(1.8.9),junit 4.10 这可能是因为任何没有用java 1.8编译的jar吗? 我应该确保我使用的所有罐子都是用java8编译的吗?如果是,那可能是一个坏兆头:(

    我尝试通过命令提示符运行junit并且它有效。

    java -cp ./target/package-test:./target/mycompany-common.jar:./lib/junit-4.6.jar org.junit.runner.JUnitCore com.mycompany.JunitTest

    ===================================================================================== 
              Tests:    1
            Batches:    1
            Threads:    1
               Host: remote
    
    
    =====================================================================================
    TEST                                                    RUN FAIL ERR SKIP    DURATION
    JunitTest                                                1    1              0.068 sec
    -------------------------------------------------------------------------------------
    TOTAL                                                    1    1     
    =====================================================================================
    The following tests had failures or errors:
    com.mycompany.JunitTest
    
    The failures and errors can be seen in the following files:
    /target/reports/junit/TEST-com.mycompany.JunitTest.txt
    
    Results of first failed test:
    Testsuite: com.mycompany.JunitTest
    Tests run: 1, Failures: 0, Errors: 1, Time elapsed: 0.068 sec
    
    Testcase: test took 0.018 sec
        Caused an ERROR
    Expecting a stackmap frame at branch target 65
    Exception Details:
      Location:
        com/mycompany/Identifier.equals(Ljava/lang/Object;)Z @26: ifne
      Reason:
        Expected stackmap frame at this location.
      Bytecode:
        0x0000000: 033d 11ff ff3e 1215 1100 35b8 001b 2bc1
        0x0000010: 0002 1100 353d 1100 003e 9a00 271c 1100
        0x0000020: 35a0 0016 1d11 0000 a000 0f12 151c 1d04
        0x0000030: b800 4111 ffff 3e12 1511 0036 b800 1b03
        0x0000040: ac1d 9b00 0f12 151c 1d03 b800 4111 ffff
        0x0000050: 3e12 1511 0039 b800 1b2b c000 023a 0412
        0x0000060: 1511 003a b800 1b2a b400 2619 04b4 0026
        0x0000070: b600 43ac                              
      Stackmap Table:
        same_frame_extended(@89)
    
    java.lang.VerifyError: Expecting a stackmap frame at branch target 65
    Exception Details:
      Location:
        com/mycompany/Identifier.equals(Ljava/lang/Object;)Z @26: ifne
      Reason:
        Expected stackmap frame at this location.
      Bytecode:
        0x0000000: 033d 11ff ff3e 1215 1100 35b8 001b 2bc1
        0x0000010: 0002 1100 353d 1100 003e 9a00 271c 1100
        0x0000020: 35a0 0016 1d11 0000 a000 0f12 151c 1d04
        0x0000030: b800 4111 ffff 3e12 1511 0036 b800 1b03
        0x0000040: ac1d 9b00 0f12 151c 1d03 b800 4111 ffff
        0x0000050: 3e12 1511 0039 b800 1b2b c000 023a 0412
        0x0000060: 1511 003a b800 1b2a b400 2619 04b4 0026
        0x0000070: b600 43ac                              
      Stackmap Table:
        same_frame_extended(@89)
    
        at com.mycompany.JunitTest.test(JunitTest.java:17)
    
    

3 个答案:

答案 0 :(得分:1)

从Java 8开始,没有--usesplitverifier的等价物。

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

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

答案 1 :(得分:0)

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

方法1:您可以使用-XX:-UseSplitVerifier参数来解决此问题,而无需担心升级库文件。

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

  1. 确定并保留应用程序使用的外部库列表。
  2. 确定列表后,请继续逐个删除外部库文件并插入升级后的版本库文件,以帮助您隔离可能导致问题的库。在我的情况下:j2ee.jar和openjpa-1.2.2 jar文件创建了一个问题,然后我升级了这些已解决迁移问题的库。
  3. 找出导致问题的图书馆并将其逮捕,这是一个缓慢而痛苦的过程。

答案 2 :(得分:0)

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