5

我一直被这个问题所困扰,并设法将其缩小到一个小文件,该文件在任务中设置为从Ant调用时失败,但在设置为时成功java.lang.VerifyErrorforkfalse<java>forktrue

独立的文件是:

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当使用set调用时,true它会成功。特定的异常VerifyError,尤其是与“ Bad type on operand stack”结合时,从我所读到的内容中指向编译器错误,但是根据Ant 任务的fork属性,它为什么会成功或失败,这超出了我的理解。<java>有什么想法吗?我正在Ubuntu 12.04使用以下 java 工具运行:

$ 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

重要更新

当从 Ant 调用并fork设置为时,false我还必须显式添加/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

当然,必须添加rt.jarCLASSPATH 非常奇怪,尤其是因为它是我正在使用rt.jar的版本。java

4

3 回答 3

3

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

于 2014-01-07T19:12:56.740 回答
2

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

根据您的描述,它并不真正依赖于 fork 属性,仅依赖于类路径。

于 2014-09-14T22:05:26.330 回答
0

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

我遇到过同样的问题。要解决它:

  1. 更新 Java。在构建环境和执行环境上。应该结束了1.8.0_75
  2. 如果在您的项目依赖项中使用,请更新 CGLIB。2.2->3.2.4解决了这个问题。
于 2016-09-06T10:35:01.497 回答