Когда мы получаем java.lang.NoSuchMethodError, даже если jar/класс имеет определенный метод

StackOverflow https://stackoverflow.com/questions/1048779

  •  20-08-2019
  •  | 
  •  

Вопрос

Я использую библиотеку 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.Invocate.evaluate(Invocate.java:175)
spin.off.SpinOffEvaluator$1.run(SpinOffEvaluator.java:108)
java.lang.Thread.run (неизвестный источник)

Это было полезно?

Решение 3

Я обнаружил, что в один из сторонних jar-файлов входит более старая версия библиотеки iText.

Другие советы

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

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

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

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

  2. Банку нет в пути к классам во время выполнения, а только во время компиляции.Но тогда вы получите NoClassDefFoundError когда доступ к iText осуществляется впервые, что не так.

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

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

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

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

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

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

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

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

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

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

Была несколько похожая проблема: при более глубоком исследовании я заметил, что метод класса Table в добавленном мной стороннем jar-файле конфликтует с соответствующим табличным методом itext-2.0.4 jar.Поэтому я удалил сторонний jar-файл из папки классов и библиотек и запустил чистую перестройку, и теперь он отлично отображается.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top