java.lang.VerifyError: Schlechte Typ auf Operanden-stack in der Methode com.Sonne.net.httpserver.spi.HttpServerProvider

Wurde ich geplagt von diesem problem und konnte einzugrenzen, um eine kleine Datei, die fehl werfen die java.lang.VerifyError beim Aufruf von Ant mit fork eingestellt false im <java> Aufgabe, aber gelingt wenn fork eingestellt ist true.

Die geschlossene Datei:

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);
    }
}

Wenn Sie angerufen werden, mit Ant und fork eingestellt false es wirft:

 [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)

Wenn Sie angerufen werden, mit fork eingestellt true es gelingt. Die spezifische Ausnahme VerifyError vor allem, wenn kombiniert mit "Bad type on operand stack" Punkte zu einem compiler-bug aus, was ich gelesen habe, aber warum sollte es Erfolg haben oder scheitern, je nach fork Attribut des <java> Ant-task ist mir schleierhaft. Irgendwelche Gedanken? Ich bin mit Ubuntu 12.04 mit dem folgenden java-tools:

$ 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

wichtiges update

Beim Aufruf von Ant mit fork eingestellt false ich habe auch explizit hinzufügen /usr/lib/jvm/jdk1.7.0/jre/lib/rt.jar zu den CLASSPATH, um die zum auslösen des VerifyError Ausnahme. Andernfalls schlägt es fehl, vor erreichen, dass Punkt mit:

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

Natürlich dass Sie rt.jar im CLASSPATH ist mächtig seltsam vor allem, da es die rt.jar des java version, die ich verwende.

Was bedeutet ant -diagnostics | grep java.vm sagen?
Dies ist sehr wahrscheinlich auf eine jar-Datei-mismatch oder so.
aktualisiert die post

InformationsquelleAutor Marcus Junius Brutus | 2013-09-19

Schreibe einen Kommentar