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 で呼び出して 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は、私が読んだものからコンパイラのバグを示していますが、 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

重要な更新

forkに設定してAnt から呼び出された場合、例外をトリガーするために、false明示的に/usr/lib/jvm/jdk1.7.0/jre/lib/rt.jarCLASSPATH に追加する必要もあります。VerifyErrorそうしないと、そのポイントに到達する前に次のように失敗します。

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

もちろんrt.jar、CLASSPATH に追加する必要があるのは、特に私が使用しているバージョン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 に答える
0

クラスがロードされると、いくつかの検証手順が実行されます。バイトコードがエラーで生成された場合、クラスローダーは VerifyError を発生させる可能性があります。

同じ問題がありました。それを解決するには:

  1. Java を更新します。ビルド環境と実行環境。終わったはず1.8.0_75
  2. プロジェクトの依存関係で使用されている場合は、CGLIB を更新します。2.2->3.2.4問題を解決しました。
于 2016-09-06T10:35:01.497 に答える