繁体   English   中英

java.lang.VerifyError:方法com.sun.net.httpserver.spi.HttpServerProvider中的操作数堆栈上的类型错误

[英]java.lang.VerifyError: Bad type on operand stack in method com.sun.net.httpserver.spi.HttpServerProvider

我一直被这个问题困扰,并设法将其范围缩小到一个小文件,当在<java>任务中将fork设置为false时从Ant调用时, 无法抛出java.lang.VerifyError ,但是 fork设置为true成功了

自包含文件为:

package foo;

import javax.xml.ws.Endpoint;

import javax.jws.WebService;

@WebService
class Hello  {
    public String sayHello() {
        return "hello";
    }
}


public class FooMain {
    public static void main(String args[]) throws Exception {
        Object implementor = new Hello();
        String address = "http://localhost:9000/SoapContext/SoapPort";
        Endpoint.publish(address, implementor);
    }
}

在Ant和fork设置为false情况下调用时,将引发:

 [java] java.lang.VerifyError: Bad type on operand stack
 [java] Exception Details:
 [java]   Location:
 [java]     com/sun/net/httpserver/spi/HttpServerProvider$1.run()Ljava/lang/Object; @27: invokestatic
 [java]   Reason:
 [java]     Type 'sun/net/httpserver/DefaultHttpServerProvider' (current frame, stack[0]) is not assignable to 'com/sun/net/httpserver/spi/HttpServerProvider'
 [java]   Current Frame:
 [java]     bci: @27
 [java]     flags: { }
 [java]     locals: { 'com/sun/net/httpserver/spi/HttpServerProvider$1' }
 [java]     stack: { 'sun/net/httpserver/DefaultHttpServerProvider' }
 [java]   Bytecode:
 [java]     0000000: b800 2599 0007 b800 27b0 b800 2699 0007
 [java]     0000010: b800 27b0 bb00 1a59 b700 2ab8 0028 57b8
 [java]     0000020: 0027 b0                                
 [java]   Stackmap Table:
 [java]     same_frame(@10)

fork设置为true情况下调用成功。 特定的异常VerifyError特别是与“ Bad type on operand stack ”结合使用时,从我已阅读的内容中指出了一个编译器错误,但是根据<java> Ant任务的fork属性,它为什么会成功还是失败,超出了我的范围。 有什么想法吗? 我正在使用以下Java工具运行Ubuntu 12.04

$ java -version
java version "1.7.0_40"
Java(TM) SE Runtime Environment (build 1.7.0_40-b43)
Java HotSpot(TM) Server VM (build 24.0-b56, mixed mode)
$ javac -version
javac 1.7.0_40
$ ant -version
Apache Ant(TM) version 1.8.2 compiled on December 3 2011
$ ant -diagnostics | grep java.vm
java.vm.version : 24.0-b56
java.vm.vendor : Oracle Corporation
java.vm.name : Java HotSpot(TM) Server VM
java.vm.specification.name : Java Virtual Machine Specification
java.vm.specification.vendor : Oracle Corporation
java.vm.specification.version : 1.7
java.vm.info : mixed mode

重要更新

fork设置为false Ant调用时,我还必须显式将/usr/lib/jvm/jdk1.7.0/jre/lib/rt.jar添加到CLASSPATH中,以触发VerifyError异常。 否则,它会在达到该点之前失败,并显示以下信息:

javax.xml.ws.WebServiceException: Provider com.sun.xml.internal.ws.spi.ProviderImpl not found

当然,必须在CLASSPATH中添加rt.jar非常奇怪,特别是因为它是我正在使用的java版本的rt.jar

这很可能是由于Java版本之间的不匹配所致,我看到您正在运行1.7.0_40和1.7.0_24。 在调用Ant之前,请确保将JAVA_HOME设置为1.7.0_40 JDK。 有关如何执行此操作的其他信息,请参见以下帖子。 如何更改ANT的JAVA_HOME?

好吧,很可能这只是一个编译器错误 ,请参阅http://bugs.java.com/bugdatabase/view_bug.do?bug_id=8006684

而且,它实际上并不取决于您的描述的fork属性,只有classpath依赖。

加载类后,将执行一些验证过程。 如果生成的字节码有错误,则classloader可能会引发VerifyError。

我遇到过同样的问题。 解决方法:

  1. 更新Java。 在构建环境和执行环境上。 应该超过1.8.0_75
  2. 如果在项目依赖项中使用CGLIB,请更新。 2.2 > 3.2.4解决了该问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM