2

我知道这java.lang.NoSuchMethodError意味着用于编译的类的版本与运行时使用的版本不同。通常,当我看到这个问题时,我会以java -verbose模式启动 app.server,它会告诉我加载类的 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)

我可以/应该使用其他方法吗?谢谢你的帮助。

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 回答