java.lang.NoSuchMethodError
コンパイルに使用されるクラスのバージョンが実行時に使用されるバージョンと異なることを意味することを知っています。通常、この問題が発生した場合、app.server をjava -verbose
モードで起動します。これにより、クラスのロード元の jar ファイルが示されます。その jar ファイルが使用するつもりだったものではない場合、使用している jar ファイルのバージョンが正しくないことがわかります。
私が使用する別のアプローチはjavap
、実行時に使用している jar ファイル内のクラスのメソッド シグネチャを調べて、jar に異なるメソッド シグネチャを持つクラスが実際に含まれていることを確認することです。
OSGi コンテナーである Karaf でこのエラーが表示されていますが、上記のアプローチはどれも役に立ちません。java -verbose
jar を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)
私が使用できる/使用すべき他のアプローチはありますか? ご協力いただきありがとうございます。