2

java.lang.NoSuchMethodErrorコンパイルに使用されるクラスのバージョンが実行時に使用されるバージョンと異なることを意味することを知っています。通常、この問題が発生した場合、app.server をjava -verboseモードで起動します。これにより、クラスのロード元の jar ファイルが示されます。その jar ファイルが使用するつもりだったものではない場合、使用している jar ファイルのバージョンが正しくないことがわかります。

私が使用する別のアプローチはjavap、実行時に使用している jar ファイル内のクラスのメソッド シグネチャを調べて、jar に異なるメソッド シグネチャを持つクラスが実際に含まれていることを確認することです。

OSGi コンテナーである Karaf でこのエラーが表示されていますが、上記のアプローチはどれも役に立ちません。java -verbosejar をjavap表示し、メソッド シグネチャを表示します。メソッド シグネチャはエラー スタック トレースのものと同じです。つまり、実行時に使用されている jar のクラスには、jvm が見つけられないと言っているのと同じメソッド シグネチャがあることがわかります。

役立つ場合は、正確なスタック トレースを次に示します。

java.lang.NoSuchMethodError: org.apache.axiom.om.OMXMLBuilderFactory.createSOAPModelBuilder(Ljava/io/InputStream;Ljava/lang/String;)Lorg/apache/axiom/soap/SOAPModelBuilder;
at org.apache.axis2.builder.SOAPBuilder.processDocument(SOAPBuilder.java:55)
at org.apache.axis2.transport.TransportUtils.createDocumentElement(TransportUtils.java:179)
at org.apache.axis2.transport.TransportUtils.createSOAPMessage(TransportUtils.java:145)
at org.apache.axis2.transport.TransportUtils.createSOAPMessage(TransportUtils.java:108)
at org.apache.axis2.transport.TransportUtils.createSOAPMessage(TransportUtils.java:67)
at org.apache.axis2.description.OutInAxisOperationClient.handleResponse(OutInAxisOperation.java:354)
at org.apache.axis2.description.OutInAxisOperationClient.send(OutInAxisOperation.java:421)
at org.apache.axis2.description.OutInAxisOperationClient.executeImpl(OutInAxisOperation.java:229)
at org.apache.axis2.client.OperationClient.execute(OperationClient.java:165)
at org.wso2.carbon.authenticator.stub.AuthenticationAdminStub.login(AuthenticationAdminStub.java:659)

私が使用できる/使用すべき他のアプローチはありますか? ご協力いただきありがとうございます。

4

2 に答える 2

1

Karaf コマンドexports [ids]、 、imports [ids]classes [ids]組み合わせて使用​​できますgrep (各コマンドには--helpオプションがあります)。

エラーをスローするバンドル (ID N) から、imports N | grep org.apache.axiom.om実際にそのパッケージをインポートしているバンドルがわかります。

反対側から近づくと、exports | grep org.apache.axiom.omそのパッケージをエクスポートするバンドルが一覧表示されます。

エクスポートから複数の行が表示され、インポート コマンドで間違ったバージョンが使用されていることが示されると思います。

于 2013-04-28T01:20:31.777 に答える
0

java -verbose:class を使用して、クラスがどこからロードされているかを確認することもできます。これは、問題のあるクラスが、予期した別のバンドルからロードされていることを示している可能性があります。

于 2013-05-10T12:54:14.457 に答える