2013-04-27 115 views
2

我知道java.lang.NoSuchMethodError意味着用于编译的类的版本与运行时使用的版本不同。通常,当我看到这个问题时,我以java -verbose模式启动app.server,它告诉我加载类的jar文件。如果那个jar文件不是我打算使用的那个,我知道我使用了一个不正确的jar文件版本。如何解决java.lang.NoSuchMethodError?

我使用的另一种方法是使用javap查看我在运行时使用的jar文件中类的方法签名,以确认jar确实包含具有不同方法签名的类。

我看到这个错误现在在卡拉夫,一个OSGi容器,并没有上述方法正在帮助。 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

你从哪里学到这门课?你从服务中获得了吗?你使用Maven还是任何依赖管理库? – Peter 2013-05-21 19:13:44

+0

你好,约翰,你最终是否解决了这个问题并找到了原因?我在这里面对同样的问题。 – 2016-01-26 21:06:30

回答

1

卡拉夫命令exports [ids],imports [ids]classes [ids]可以与grep(每个命令有--help选项)组合使用。

从引发错误(使用ID为N)的软件包中,imports N | grep org.apache.axiom.om会告诉您它实际上是从哪个软件包导入该软件包。

并且从另一端接近,exports | grep org.apache.axiom.om将列出导出该软件包的软件包。

我希望你会看到多于一行的出口和导入命令将显示不正确的版本正在使用。

0

您也可以使用java -verbose:class来查看从哪里加载类,这可能表明有问题的类是从您期望的不同捆绑包加载的。

+0

感谢您的回复。我已经表明我使用这种方法。 – 2013-05-13 15:11:22

相关问题