我们什么时候得到java.lang.NoSuchMethodError,即使jar /类有特定的方法

我正在使用IText库来促进applet中的pdf导出。 在导出调用期间,它失败并出现以下错误:

java.lang.NoSuchMethodError: com.lowagie.text.pdf.PdfPTable.completeRow()V 

我在JD Decompiler中打开了Itext jar / PdfPtable.class,并确认该类具有completeRow作为公共方法。

甚至当jar / class有它时,有人可以解释抛出java.lang.NoSuchMethodError的可能情况吗?

这是堆栈跟踪; 可能不是很有帮助,因为大多数调用是我们的应用程序特定的。

导出到CSV文件时出错 – java.lang.NoSuchMethodError:com.lowagie.text.pdf.PdfPTable.completeRow()V
com.blox.table.action.ExportToCSVAction.actionPerformed(ExportToCSVAction.java:193)
javax.swing.AbstractButton.fireActionPerformed(未知来源)
javax.swing.AbstractButton $ Handler.actionPerformed(未知来源)
javax.swing.DefaultButtonModel.fireActionPerformed(未知来源)
javax.swing.DefaultButtonModel.setPressed(未知来源)
javax.swing.plaf.basic.BasicButtonListener.mouseReleased(未知来源)
java.awt.Component.processMouseEvent(未知来源)
javax.swing.JComponent.processMouseEvent(未知来源)
java.awt.Component.processEvent(未知来源)
java.awt.Container.processEvent(未知来源)
java.awt.Component.dispatchEventImpl(未知来源)
java.awt.Container.dispatchEventImpl(未知来源)
java.awt.Component.dispatchEvent(未知来源)
java.awt.LightweightDispatcher.retargetMouseEvent(未知来源)
java.awt.LightweightDispatcher.processMouseEvent(未知来源)
java.awt.LightweightDispatcher.dispatchEvent(未知来源)
java.awt.Container.dispatchEventImpl(未知来源)
java.awt.Window.dispatchEventImpl(未知来源)
java.awt.Component.dispatchEvent(未知来源)
java.awt.EventQueue.dispatchEvent(未知来源)
java.awt.EventDispatchThread.pumpOneEventForFilters(未知来源)
java.awt.EventDispatchThread.pumpEventsForFilter(未知来源)
java.awt.EventDispatchThread.pumpEventsForHierarchy(未知来源)
java.awt.EventDispatchThread.pumpEvents(未知来源)
java.awt.EventDispatchThread.pumpEvents(未知来源)
java.awt.EventDispatchThread.run(未知来源)
com.lowagie.text.pdf.PdfPTable.completeRow()V
com.blox.table.view.GridTableModel $ PdfExportWriter.writeNewLine(GridTableModel.java:7259)
com.blox.table.view.GridTableModel.buildExportData(GridTableModel.java:3111)
com.blox.table.view.GridTableModel.export(GridTableModel.java:2541)
com.blox.table.view.GridTable.export(GridTable.java:1318)
com.blox.table.action.ExportToCSVAction.exportToFile(ExportToCSVAction.java:248)
com.blox.table.action.ExportToCSVAction.access $ 1(ExportToCSVAction.java:245)
com.blox.table.action.ExportToCSVAction $ Worker.exportToCSVFile(ExportToCSVAction.java:111)
sun.reflect.NativeMethodAccessorImpl.invoke0(原生方法)
sun.reflect.NativeMethodAccessorImpl.invoke(未知来源)
sun.reflect.DelegatingMethodAccessorImpl.invoke(未知来源)
java.lang.reflect.Method.invoke(未知来源)
spin.Invocation.evaluate(Invocation.java:175)
spin.off.SpinOffEvaluator $ 1.run(SpinOffEvaluator.java:108)
java.lang.Thread.run(未知来源)

可能是您的类路径中出现了不同的版本,或者自编译您的类以来该特定方法的签名已更改

  1. 通常这样的问题是因为如果在用于编译的版本之前在类路径中存在另一个版本的违规类(并且您已经如前所述进行了反编译)。 这种情况经常发生,因为类路径问题很常见,特别是专家。 在容器中,未指定已加载库的顺序。

    因此,假设您在IDE中使用iText 1.a进行编译。 然后将应用程序部署到某个容器中,其中预装了iText 1.b. 预先安装的库优先,当b

    在您的情况下,没有容器,但您可以在打包/部署期间混合库版本,或者具有不同的类路径用于开发和执行。

  2. jar在运行时不在类路径中,仅在编译时。 但是,当第一次访问iText时,你会得到一个NoClassDefFoundError ,但实际情况并非如此。

  3. 如果iText本身会错过第三方库,那么在调用需要不满足的依赖项的方法时,您也会得到NoClassDefFoundError

我发现其中一个第三方jar正在捆绑旧版iText库

这意味着类PdfPTable的两个版本都在您的类路径中。 您正在使用的两个jar文件可能已打包同一类的不同版本。 简单的方法是在类路径中对jar文件执行jar -tf,为类名称执行grep。 删除过时版本或更改类路径中jar文件的顺序。

我正在使用netbeans IDE,我有时会遇到这个问题。 例如,当我更改方法的参数时,它不再起作用了! 无意中,我明白在更改方法后,如果我右键单击项目并按“清理”,则不再有问题了!

我有同样的问题,我点击了清洁和构建项目按钮,现在一切都很好。 也许有时问题会从以前的版本中卡住而你需要重建。

它也可能是你的applet类路径中出现了两个版本的jar,而且加载的那个版本的签名与你的代码编译时的签名不同

也许在你的反编译版本之前,你的类路径中还有这个类的另一个版本。
编辑或者您已经更新了包,但是忘记将它部署到运行时类路径,或者您还没有更新编译类路径,即您的运行时环境与您的编译时环境不同步。

public void completeRow()在2.0.5中引入。 您必须在运行时类路径中具有2.0.5之前的版本。 如果您仍然遇到此问题,请研究该过程启动的类路径。 如前所述,您正在使用2.1.5版本进行编译。

这对我有用。

我使用net beans IDE。 我只是删除了httpclient和核心jar文件(我正在使用4.2.1)并重新添加它们。 这似乎改变了秩序并且有效。

添加到“Last Paldin”的答案帮助了我。

有一个类似的问题,在更深入的调查注意到我添加的第三方jar中的Table类方法与itext-2.0.4 jar的相应表方法冲突。 所以我从classpath和Libraries文件夹中删除了第三方jar并运行一个干净的重建,现在它完美呈现。