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

时间:2013-09-19 19:50:19

标签: java ant bytecode

我一直受到这个问题的困扰,并设法将其范围缩小到一个小文件,失败在从java.lang.VerifyError设置为{{fork的Ant调用时抛出false<java>任务中1}},但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”结合使用时,指向我读过的编译器错误,但为什么它应该成功或失败,具体取决于fork的{​​{1}}属性1}} Ant任务超出了我的范围。有什么想法吗?我使用以下java工具运行<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的Ant调用时,我还必须向CLASSPATH显式添加false以触发/usr/lib/jvm/jdk1.7.0/jre/lib/rt.jar异常。否则它会在到达该点之前失败:

VerifyError

当然,必须在CLASSPATH中添加javax.xml.ws.WebServiceException: Provider com.sun.xml.internal.ws.spi.ProviderImpl not found 非常奇怪,特别是因为它是我正在使用的rt.jar版本的rt.jar

3 个答案:

答案 0 :(得分:3)

这很可能是由于java版本不匹配,我看到你运行的是1.7.0_40和1.7.0_24。确保在调用Ant之前将JAVA_HOME设置为1.7.0_40 JDK。有关如何执行此操作的其他信息,请参阅以下帖子。 How do I change the JAVA_HOME for ant?

答案 1 :(得分:2)

嗯,很有可能,它只是编译器错误,请参阅http://bugs.java.com/bugdatabase/view_bug.do?bug_id=8006684

根据你的描述,它并不真正依赖于fork属性,只有classpath可以。

答案 2 :(得分:0)

加载类时,会执行一些验证程序。如果生成了带有错误的字节代码,则classloader可能引发VerifyError。

我有同样的问题。要解决它:

  1. 更新Java。在构建环境和执行环境中。应该超过1.8.0_75
  2. 如果在项目依赖项中使用,则更新CGLIB。 2.2 - &gt; 3.2.4解决了这个问题。