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

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/1048779/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-11 22:44:01  来源:igfitidea点击:

When do we get java.lang.NoSuchMethodError even when the jar/class has the particualar method

javaappletnosuchmethoderror

提问by Krishna Kumar

I am using IText library to facilitate pdf export in an applet. During the export call it fails with following error:

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

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

I opened the Itext jar/PdfPtable.class in JD Decompiler and confirmed that the class has completeRow as a public method.

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

Can somebody explain the possible scenarios when a java.lang.NoSuchMethodErroris thrown even when jar/class has it?

有人可以解释当 ajava.lang.NoSuchMethodError被抛出时可能出现的情况,即使 jar/class 有它吗?

Here is the stack trace; may not be very helpful as most of the calls are our application specific.

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

Error while exporting to the CSV file - java.lang.NoSuchMethodError: com.lowagie.text.pdf.PdfPTable.completeRow()V
com.blox.table.action.ExportToCSVAction.actionPerformed(ExportToCSVAction.java:193)
javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
javax.swing.DefaultButtonModel.setPressed(Unknown Source)
javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
java.awt.Component.processMouseEvent(Unknown Source)
javax.swing.JComponent.processMouseEvent(Unknown Source)
java.awt.Component.processEvent(Unknown Source)
java.awt.Container.processEvent(Unknown Source)
java.awt.Component.dispatchEventImpl(Unknown Source)
java.awt.Container.dispatchEventImpl(Unknown Source)
java.awt.Component.dispatchEvent(Unknown Source)
java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
java.awt.Container.dispatchEventImpl(Unknown Source)
java.awt.Window.dispatchEventImpl(Unknown Source)
java.awt.Component.dispatchEvent(Unknown Source)
java.awt.EventQueue.dispatchEvent(Unknown Source)
java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
java.awt.EventDispatchThread.pumpEvents(Unknown Source)
java.awt.EventDispatchThread.pumpEvents(Unknown Source)
java.awt.EventDispatchThread.run(Unknown Source)
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(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
java.lang.reflect.Method.invoke(Unknown Source)
spin.Invocation.evaluate(Invocation.java:175)
spin.off.SpinOffEvaluator$1.run(SpinOffEvaluator.java:108)
java.lang.Thread.run(Unknown Source)

导出到 CSV 文件时出错 - java.lang.NoSuchMethodError: com.lowagie.text.pdf.PdfPTable.completeRow()V
com.blox.table.action.ExportToCSVAction.actionPerformed(ExportToCSVAction.java:193)
javax.swing。 AbstractButton.fireActionPerformed(Unknown Source)
javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
javax.swing.DefaultButtonModel.setPressed(Unknown Source)
javax.swing.plaf.basic。 BasicButtonListener.mouseReleased(Unknown Source)
java.awt.Component.processMouseEvent(Unknown Source)
javax.swing.JComponent.processMouseEvent(Unknown Source)
java.awt.Component.processEvent(Unknown Source)
java.awt.Container.processEvent(Unknown Source)
java.awt.Component.dispatchEventImpl(Unknown Source)
java.awt.Container.dispatchEventImpl(Unknown Source)
java.awt.Component.dispatchEvent(Unknown Source)
java.awt.LightweightDispatcher. retargetMouseEvent(Unknown Source)
java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
java.awt.Container.dispatchEventImpl(Unknown Source)
java.awt.Window.dispatchEventImpl(Unknown Source)
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.EventDisp pumpEvents(Unknown Source)
java.awt.EventDispatchThread.run(Unknown Source)
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
(Native Method) sun.reflect.NativeMethodAccessorImpl.invoke
(Unknown Source)
sun.reflect .DelegatingMethodAccessorImpl.invoke(Unknown Source)
java.lang.reflect.Method.invoke(Unknown Source)
spin.Invocation.evaluate(Invocation.java:175)
spin.off.SpinOffEvaluator$1.run(SpinOffEvaluator.java:108)
java.lang.Thread.run(来源不明)

采纳答案by Krishna Kumar

I found out that one of the third party jar was bundling a older version of iText library

我发现其中一个第三方 jar 捆绑了旧版本的 iText 库

回答by akf

perhaps there is another version of this class in your classpath before the version that you decompiled.
edit: Oryou have updated the package, but have forgotten to either deploy it to your runtime classpath or you havent updated the compile classpath, ie your runtime env is out of sync with your compiletime env.

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

public void completeRow()was introduced in 2.0.5. you must have a version before 2.0.5 in your runtime classpath. if you are still experiencing this problem, please study the classpath for the startup of the process. as stated before, you are compiling with the 2.1.5 version.

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

回答by Chris Gow

It could be that a different version appears in your classpath or that the signature of that particular method has changed since your compiled your class

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

回答by Peter Kofler

  1. Usually such problems are cause if there is another version of the offending class in your classpath before the version that you used for compile (and that you decompiled as said before). This happens often as classpath issues are common, also with experts, esp. in containers, where the order of loaded libraries is unspecified.

    So lets say you use iText 1.a to in your IDE and you compile against. Then you deploy your application into some container, where iText 1.b is preinstalled. Preinstalled libraries take precedence and when b < a then you run into this kind of problem.

    In your case there is no container, but you could mix up library versions during packaging/deployment or have different classpaths for development and execution.

  2. The jar is not in the classpath at runtime, only at compile time. But then you would get a NoClassDefFoundErrorwhen iText is accessed for the first time, which is not the case.

  3. If iText itself would miss a third party library you would also get a NoClassDefFoundErrorwhen calling the method that needs the unsatisfied dependency.

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

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

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

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

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

回答by Armadillo

It could also be that two versions of the jar appear in your applet classpath and the one that got loaded has a different signature than the one that your code was compiled with

也可能是您的小程序类路径中出现了两个版本的 jar,并且加载的版本与编译代码的版本具有不同的签名

回答by Armadillo

That means two versions of the class PdfPTable are in your class path. Two jar files that you are using might have packaged different versions of the same class. Easy way to figure out is to do a jar -tf on the jar files in the classpath, and grep for your classname. Either remove the stale version or change the order of jar files in your class path.

这意味着类 PdfPTable 的两个版本在您的类路径中。您正在使用的两个 jar 文件可能打包了同一类的不同版本。找出问题的简单方法是在类路径中的 jar 文件上执行 jar -tf,并为您的类名执行 grep。删除旧版本或更改类路径中 jar 文件的顺序。

回答by mar

I am using netbeans IDE and I had this problem some times. for example when I changed the parameters of a method, it didn't work anymore! Accidentally, I understood that after changing the method, if I right click on the project and press "clean", there were no problem anymore!

我正在使用 netbeans IDE,有时我遇到了这个问题。例如,当我更改方法的参数时,它不再起作用了!一不小心就明白了,改方法后,在项目上右击按“clean”,就没有问题了!

回答by Stefanos Kargas

I had the same problem and I hit the Clean and Build Project button and everything works great now. Maybe sometimes the problem is stuck from previous builds and you need to rebuild.

我遇到了同样的问题,我点击了 Clean and Build Project 按钮,现在一切都很好。也许有时问题是从以前的构建中卡住的,您需要重新构建。

回答by Sean G

This worked for me.

这对我有用。

I use net beans IDE. I simply deleted the httpclient and core jar files (I'm using 4.2.1) and re-added them. That seemed to change the order and it worked.

我使用网豆IDE。我只是删除了 httpclient 和核心 jar 文件(我使用的是 4.2.1)并重新添加它们。这似乎改变了顺序并且它起作用了。

Adding to "Last Paldin's" Answer that helped me.

添加到对我有帮助的“Last Paldin”的答案中。

回答by Juma Wasike

Had a somewhat similar problem, on deeper investigation noticed that a Table class method in a 3rd party jar I had added was conflicting with itext-2.0.4 jar's corresponding table method. So I removed the 3rd party jar from the classpath and Libraries folder and run a clean rebuild and now it renders perfectly.

有一个有点类似的问题,经过深入调查发现我添加的第 3 方 jar 中的 Table 类方法与 itext-2.0.4 jar 对应的 table 方法冲突。所以我从类路径和库文件夹中删除了 3rd 方 jar 并运行干净的重建,现在它完美呈现。