2013-04-27 66 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

相關問題