Когда мы получаем java.lang.NoSuchMethodError, даже если jar/class имеет метод particualar

Я использую библиотеку IText для облегчения экспорта pdf в апплет. Во время вызова экспорта он выходит из строя со следующей ошибкой:

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

Я открыл файл Itext jar/PdfPtable.class в JD Decompiler и подтвердил, что класс имеет completeRow как общедоступный метод.

Может кто-нибудь объяснить возможные сценарии, когда бросается java.lang.NoSuchMethodError, даже если jar/class имеет его?

Вот трассировка стека; может быть не очень полезно, так как большинство вызовов являются нашими приложениями.

Ошибка при экспорте в файл 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

Я узнал, что одна из сторонних банков связывает старую версию библиотеки iText

Ответ 2

Возможно, что в вашем пути к классам появляется другая версия или что подпись этого конкретного метода изменилась с момента составления вашего класса

Ответ 3

  • Обычно такие проблемы являются причиной, если есть другая версия класса-нарушителя в вашем пути к классу до версии, которую вы использовали для компиляции (и которую вы декомпилировали, как сказано ранее). Это происходит часто, поскольку проблемы с classpath являются общими, также с экспертами, особенно. в контейнерах, где порядок загруженных библиотек не указан.

    Итак, скажем, вы используете iText 1.a в своей среде разработки и компилируете ее. Затем вы развертываете свое приложение в каком-то контейнере, где предварительно установлен iText 1.b. Предварительно установленные библиотеки имеют приоритет, и когда b < а затем вы сталкиваетесь с такой проблемой.

    В вашем случае нет контейнера, но вы можете смешивать версии библиотеки во время упаковки/развертывания или иметь разные пути к классам для разработки и выполнения.

  • Ящик не находится в пути к классам во время выполнения, только во время компиляции. Но тогда вы получите NoClassDefFoundError, когда iText будет доступен в первый раз, что не так.

  • Если iText сам пропустит стороннюю библиотеку, вы также получите NoClassDefFoundError при вызове метода, который нуждается в неудовлетворительной зависимости.

Ответ 4

Это означает, что две версии класса PdfPTable находятся в вашем пути к классу. Два файла jar, которые вы используете, могут иметь различные версии одного и того же класса. Легкий способ понять, это сделать jar -tf в файлах jar в пути к классам и grep для вашего имени класса. Удалите устаревшую версию или измените порядок файлов jar в своем пути к классу.

Ответ 5

Я использую NetBeans IDE, и у меня была эта проблема несколько раз. например, когда я изменил параметры метода, он больше не работает! Случайно, я понял, что после изменения метода, если я нажму правой кнопкой мыши на проекте и нажмите "clean", больше не было проблем!

Ответ 6

У меня была та же проблема, и я нажал кнопку "Очистить и создать проект", и теперь все отлично работает. Может быть, иногда проблема застряла в предыдущих сборках, и вам нужно перестроить.

Ответ 7

возможно, есть другая версия этого класса в вашем пути к классу перед версией, которую вы декомпилировали.
изменить. Или вы обновили пакет, но забыли либо развернуть его на пути к классу среды выполнения, либо не обновили путь к компиляции, т.е. ваша среда выполнения не синхронизирована с вашей программой compileime env.

public void completeRow() был введен в 2.0.5. вы должны иметь версию до 2.0.5 в вашем пути к среде выполнения. если вы все еще испытываете эту проблему, изучите путь к классу для запуска процесса. как указано ранее, вы компилируете версию 2.1.5.

Ответ 8

Также может быть, что две версии jar появляются в вашем пути к классу апплетов, а тот, который был загружен, имеет другую подпись, отличную от той, которую ваш код был скомпилирован с помощью

Ответ 9

Это сработало для меня.

Я использую net beans IDE. Я просто удалил файлы httpclient и core jar (я использую 4.2.1) и повторно добавил их. Казалось, это изменило порядок, и это сработало.

Добавление в ответ "Последний Палдин", который помог мне.

Ответ 10

Имел несколько схожую проблему, при более глубоком исследовании заметили, что метод класса таблицы в стороннем банке, который я добавил, противоречил его методу tableext-2.0.4 jar. Поэтому я удалил стороннюю банку из папки классов и библиотек и выполнил чистую перестройку, и теперь она отлично отображается.