java.lang.VerifyError:分支目标421处的堆栈映射帧不一致

时间:2016-02-02 16:41:52

标签: java maven maven-2 maven-3 jaxws-maven-plugin

当我尝试部署war文件时出现以下错误。

SEVERE: WSSERVLET11: failed to parse runtime descriptor: java.lang.VerifyError: Inconsistent stackmap frames at branch target 421


Exception Details:
  Location:
    it/codegen/tbx/search/service/TravelBoxSearch.convertQuoteItemsEx(Ljava/lang/String;Ljava/lang/String;Ljava/util/List;)Lit/codegen/CGError; @421: getstatic
  Reason:
    Type 'it/codegen/CGResponse' (current frame, locals[5]) is not assignable to 'it/codegen/CGError' (stack map, locals[5])
  Current Frame:
    bci: @58
    flags: { }
    locals: { 'it/codegen/tbx/search/service/TravelBoxSearch', 'java/lang/String', 'java/lang/String', 'java/util/List', 'it/codegen/logging/TimeLogger', 'it/codegen/CGResponse', 'it/codegen/tbx/search/service/ShoppingBasket' }
    stack: { 'it/codegen/tbx/search/service/ShoppingBasket' }
  Stackmap Frame:
    bci: @421
    flags: { }
    locals: { 'it/codegen/tbx/search/service/TravelBoxSearch', 'java/lang/String', 'java/lang/String', 'java/util/List', 'it/codegen/logging/TimeLogger', 'it/codegen/CGError', 'it/codegen/tbx/search/service/ShoppingBasket' }
    stack: { }

  Bytecode:
    0x0000000: 013a 04b2 0127 9900 15bb 01a4 59b8 01a5
    0x0000010: b601 a6b8 01a7 b701 a83a 04b8 0222 2cb6
    0x0000020: 0223 bb07 d759 1402 1213 07d8 b707 d93a
    0x0000030: 052a 2cb7 02b0 3a06 1906 c601 6b19 06b6
    0x0000040: 02b1 3a07 1907 c601 452d c601 272d b902
    0x0000050: 4e01 009a 011e bb01 cc59 b701 cd3a 082d
    0x0000060: b902 3201 003a 0919 09b9 0233 0100 9900
    0x0000070: 4a19 09b9 0234 0100 c002 353a 0a19 0ac6
    0x0000080: 0036 190a b602 3ac6 002e 1908 bb00 3f59
    0x0000090: b700 4019 0ab6 023a b602 a4b6 0042 190a
    0x00000a0: b602 3ab6 023b b602 4cb6 0043 190a b602
    0x00000b0: 3ab6 011d 57a7 ffb2 1907 b603 cfc6 0079
    0x00000c0: 1907 b603 cfb9 0232 0100 3a09 1909 b902
    0x00000d0: 3301 0099 0063 1909 b902 3401 00c0 02cf
    0x00000e0: 3a0a 190a c600 4f19 08bb 003f 59b7 0040
    0x00000f0: 190a b604 1db6 0042 190a b605 81b6 024c
    0x0000100: b600 43b6 01e0 9900 2d19 08bb 003f 59b7
    0x0000110: 0040 190a b604 1db6 0042 190a b605 81b6
    0x0000120: 024c b600 43b6 01e1 c007 c819 0ab6 07da
    0x0000130: b607 dba7 ff99 2a2b 2db6 07c7 3a09 1909
    0x0000140: b602 8599 002b b200 29b8 0038 b200 3913
    0x0000150: 07dc b600 3b2a 1909 1907 1906 b707 dd3a
    0x0000160: 0519 0619 05b6 02ac c002 adb6 02c4 a700
    0x0000170: 34b2 0029 b800 38b2 0039 1307 deb6 003b
    0x0000180: 1905 1307 dfb6 027a a700 1ab2 0029 b800
    0x0000190: 38b2 0039 1307 e0b6 003b 1905 1307 e1b6
    0x00001a0: 027a a700 1ab2 0029 b800 38b2 0039 1303
    0x00001b0: feb6 003b 1905 1307 e2b6 027a 1905 3a07
    0x00001c0: b201 2799 0008 1904 b601 b619 07b0 3a0b
    0x00001d0: b201 2799 0008 1904 b601 b619 0bbf     
  Exception Handler Table:
    bci [27, 448] => handler: 462
    bci [462, 464] => handler: 462
  Stackmap Table:
    append_frame(@27,Object[#3374])
    full_frame(@103,{Object[#3339],Object[#3359],Object[#3359],Object[#3375],Object[#3374],Object[#3451],Object[#3623],Object[#3624],Object[#3478],Object[#3480]},{})
    same_frame_extended(@181)
    chop_frame(@184,1)
    append_frame(@204,Object[#3480])
    same_frame_extended(@307)
    chop_frame(@310,1)
    chop_frame(@366,1)
    same_frame(@369)
    same_frame(@395)
    chop_frame(@418,1)
    same_frame(@421)
    same_frame(@444)
    append_frame(@459,Object[#3451])
    full_frame(@462,{Object[#3339],Object[#3359],Object[#3359],Object[#3375],Object[#3374]},{Object[#3344]})
    full_frame(@475,{Object[#3339],Object[#3359],Object[#3359],Object[#3375],Object[#3374],Top,Top,Top,Top,Top,Top,Object[#3344]},{})

java.lang.VerifyError: Inconsistent stackmap frames at branch target 421
Exception Details:
  Location:
    it/codegen/tbx/search/service/TravelBoxSearch.convertQuoteItemsEx(Ljava/lang/String;Ljava/lang/String;Ljava/util/List;)Lit/codegen/CGError; @421: getstatic
  Reason:
    Type 'it/codegen/CGResponse' (current frame, locals[5]) is not assignable to 'it/codegen/CGError' (stack map, locals[5])
  Current Frame:
    bci: @58
    flags: { }
    locals: { 'it/codegen/tbx/search/service/TravelBoxSearch', 'java/lang/String', 'java/lang/String', 'java/util/List', 'it/codegen/logging/TimeLogger', 'it/codegen/CGResponse', 'it/codegen/tbx/search/service/ShoppingBasket' }
    stack: { 'it/codegen/tbx/search/service/ShoppingBasket' }
  Stackmap Frame:
    bci: @421
    flags: { }
    locals: { 'it/codegen/tbx/search/service/TravelBoxSearch', 'java/lang/String', 'java/lang/String', 'java/util/List', 'it/codegen/logging/TimeLogger', 'it/codegen/CGError', 'it/codegen/tbx/search/service/ShoppingBasket' }
    stack: { }
  Bytecode:
    0x0000000: 013a 04b2 0127 9900 15bb 01a4 59b8 01a5
    0x0000010: b601 a6b8 01a7 b701 a83a 04b8 0222 2cb6
    0x0000020: 0223 bb07 d759 1402 1213 07d8 b707 d93a
    0x0000030: 052a 2cb7 02b0 3a06 1906 c601 6b19 06b6
    0x0000040: 02b1 3a07 1907 c601 452d c601 272d b902
    0x0000050: 4e01 009a 011e bb01 cc59 b701 cd3a 082d
    0x0000060: b902 3201 003a 0919 09b9 0233 0100 9900
    0x0000070: 4a19 09b9 0234 0100 c002 353a 0a19 0ac6
    0x0000080: 0036 190a b602 3ac6 002e 1908 bb00 3f59
    0x0000090: b700 4019 0ab6 023a b602 a4b6 0042 190a
    0x00000a0: b602 3ab6 023b b602 4cb6 0043 190a b602
    0x00000b0: 3ab6 011d 57a7 ffb2 1907 b603 cfc6 0079
    0x00000c0: 1907 b603 cfb9 0232 0100 3a09 1909 b902
    0x00000d0: 3301 0099 0063 1909 b902 3401 00c0 02cf
    0x00000e0: 3a0a 190a c600 4f19 08bb 003f 59b7 0040
    0x00000f0: 190a b604 1db6 0042 190a b605 81b6 024c
    0x0000100: b600 43b6 01e0 9900 2d19 08bb 003f 59b7
    0x0000110: 0040 190a b604 1db6 0042 190a b605 81b6
    0x0000120: 024c b600 43b6 01e1 c007 c819 0ab6 07da
    0x0000130: b607 dba7 ff99 2a2b 2db6 07c7 3a09 1909
    0x0000140: b602 8599 002b b200 29b8 0038 b200 3913
    0x0000150: 07dc b600 3b2a 1909 1907 1906 b707 dd3a
    0x0000160: 0519 0619 05b6 02ac c002 adb6 02c4 a700
    0x0000170: 34b2 0029 b800 38b2 0039 1307 deb6 003b
    0x0000180: 1905 1307 dfb6 027a a700 1ab2 0029 b800
    0x0000190: 38b2 0039 1307 e0b6 003b 1905 1307 e1b6
    0x00001a0: 027a a700 1ab2 0029 b800 38b2 0039 1303
    0x00001b0: feb6 003b 1905 1307 e2b6 027a 1905 3a07
    0x00001c0: b201 2799 0008 1904 b601 b619 07b0 3a0b
    0x00001d0: b201 2799 0008 1904 b601 b619 0bbf     
  Exception Handler Table:
    bci [27, 448] => handler: 462
    bci [462, 464] => handler: 462
  Stackmap Table:
    append_frame(@27,Object[#3374])
    full_frame(@103,{Object[#3339],Object[#3359],Object[#3359],Object[#3375],Object[#3374],Object[#3451],Object[#3623],Object[#3624],Object[#3478],Object[#3480]},{})
    same_frame_extended(@181)
    chop_frame(@184,1)
    append_frame(@204,Object[#3480])
    same_frame_extended(@307)
    chop_frame(@310,1)
    chop_frame(@366,1)
    same_frame(@369)
    same_frame(@395)
    chop_frame(@418,1)
    same_frame(@421)
    same_frame(@444)
    append_frame(@459,Object[#3451])
    full_frame(@462,{Object[#3339],Object[#3359],Object[#3359],Object[#3375],Object[#3374]},{Object[#3344]})
    full_frame(@475,{Object[#3339],Object[#3359],Object[#3359],Object[#3375],Object[#3374],Top,Top,Top,Top,Top,Top,Object[#3344]},{})

    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:348)
    at com.sun.xml.ws.transport.http.DeploymentDescriptorParser.getImplementorClass(DeploymentDescriptorParser.java:615)
    at com.sun.xml.ws.transport.http.DeploymentDescriptorParser.parseAdapters(DeploymentDescriptorParser.java:256)
    at com.sun.xml.ws.transport.http.DeploymentDescriptorParser.parse(DeploymentDescriptorParser.java:179)
    at com.sun.xml.ws.transport.http.servlet.WSServletContextListener.parseAdaptersAndCreateDelegate(WSServletContextListener.java:131)
    at com.sun.xml.ws.transport.http.servlet.WSServletContainerInitializer.onStartup(WSServletContainerInitializer.java:65)
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5280)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1559)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1549)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)

以下是我用来编译代码的k编译器

<plugin>            

    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.3</version>
    <executions>
        <execution>
            <id>default-testCompile</id>
            <phase>${testCompile.enable}</phase>
            <goals>
                <goal>testCompile</goal>
            </goals>
        </execution>
    </executions>
    <configuration>
        <encoding>ISO-8859-1</encoding>
        <source>1.8</source>
        <target>1.8</target>
        <useIncrementalCompilation>false</useIncrementalCompilation>
        <testSource>1.8</testSource>
        <testTarget>1.8</testTarget>
        <!--<testExcludes>-->
            <!--<exclude>**/test/*.java</exclude>-->
        <!--</testExcludes>-->
    </configuration>
</plugin>

请看看并回复,抱歉我不是格式化专家。

3 个答案:

答案 0 :(得分:4)

经过多方努力,我发现了这个问题。在两个不同的库中有CGError和CGResponse的重复类。所以我猜在编译时使用的那些可能与运行时加载的那些不同。无论如何解决重复的类就行了,解决了这个问题。

PS:不要浪费时间-XX:-UseSplitVerifier配置来修复此问题,如果您使用的是Java 1.8,即使您使用的是Java 1.7,也要尽量避免使用该配置。请仔细阅读以下网址,以便更好地了解该问题。

Is there a better explanation of stack map frames?

URL中的说明如下。

Java要求验证所有加载的类,以便维护沙箱的安全性并确保代码可以安全地进行优化。请注意,这是在字节码级别完成的,因此验证不会验证Java语言的不变量,它只是根据字节码规则验证字节码是否有意义。

其中,字节码验证确保指令格式正确,所有跳转都是方法中的有效指令,并且所有指令都对正确类型的值进行操作。最后一个是堆栈映射的来源。

事情是字节码本身不包含显式类型信息。通过数据流分析隐式确定类型。例如,iconst指令创建一个整数值。如果将其存储在插槽1中,则该插槽现在具有int。如果控制流从存储浮点的代码合并而来,那么现在认为该槽具有无效类型,这意味着在覆盖它之前你不能再使用该值做任何事情。

历史上,字节码验证器使用这些数据流规则推断出所有类型。不幸的是,不可能通过字节码推断单个线性传递中的所有类型,因为向后跳转可能使已经推断的类型无效。经典验证程序通过迭代代码直到一切都停止变化来解决这个问题,可能需要多次传递。

但是,验证会使Java中的类加载速度变慢。 Oracle决定通过添加一个新的,更快的验证器来解决这个问题,它可以在一次通过中验证字节码。为此,他们需要从Java 7开始的所有新类(Java 6处于过渡状态)携带有关其类型的元数据,以便可以一次性验证字节码。由于字节码格式本身无法更改,因此此类型信息单独存储在名为StackMapTable的属性中。

只需在代码中的每个单点存储每个值的类型,显然会占用大量空间并且非常浪费。为了使元数据更小更高效,他们决定让它只列出跳转目标位置的类型。如果您考虑一下,这是您需要额外信息才能进行单程验证的唯一时间。在跳转目标之间,所有控制流都是线性的,因此您可以使用旧的推理规则推断位置之间的类型。

显式列出类型的每个位置称为堆栈映射框架。 StackMapTable属性按顺序包含帧列表,但它们通常表示为与前一帧的差异,以减少数据大小。如果方法中没有框架,当控制流从不加入时发生(即CFG是树),则可以完全省略StackMapTable属性。

因此,这是StackMapTable如何工作以及添加原因的基本思路。最后一个问题是如何创建隐式初始帧。答案当然是在方法的开头,操作数堆栈为空,局部变量槽具有方法参数类型给出的类型,这些类型是从方法描述符确定的。

如果您习惯使用Java,那么方法参数类型在字节码级别的工作方式会有一些细微差别。首先,虚方法有一个隐含的第一个参数。其次,字节码级别不存在布尔,字节,字符和短路。相反,它们都是在幕后实现的。

答案 1 :(得分:0)

就我而言,此问题与javassist版本有关,我在线程Error mocking Class which hold reference to SQLiteOpenHelper中报告了该问题

此致

答案 2 :(得分:0)

我在使用 Eclipse jee 2019-12-R 时遇到此错误。更改 Eclipse 版本修复了它。