我知道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)
我可以/应该使用其他任何方法吗?谢谢你的帮助。
答案 0 :(得分: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
将列出导出该包的包。
我希望你会看到导出的多行,导入命令会显示正在使用的版本不正确。
答案 1 :(得分:0)
您还可以使用java -verbose:class来查看从哪里加载类,这可能表明有问题的类是从您期望的其他包中加载的。