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

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

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

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

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

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

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


person Krishna Kumar    schedule 26.06.2009    source источник
comment
Я не вижу этого метода в iText 2.0.4. Какая у тебя версия?   -  person Peter Kofler    schedule 26.06.2009
comment
Я использую версию iText 2.1.5. Этот призыв не первый; на самом деле частичный экспорт в pdf успешен. [ОШИБКА] com.blox.table.action.ExportToCSVAction.actionPerformed (ExportToCSVAction.java:215) - Ошибка при экспорте в файл CSV - java.lang.NoSuchMethodError: com.lowagie.text.pdf.PdfPTable.completeRow () java.lang.RuntimeException: ошибка при экспорте в файл CSV - java.lang.NoSuchMethodError: com.lowagie.text.pdf.PdfPTable.completeRow () V   -  person akarnokd    schedule 26.06.2009
comment
Не могли бы вы переместить текст трассировки стека в свой вопрос?   -  person Krishna Kumar    schedule 26.06.2009
comment
исключение ClassNotFoundException должно быть вызвано # 2   -  person akarnokd    schedule 26.06.2009


Ответы (10)


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

person Chris Gow    schedule 26.06.2009

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

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

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

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

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

person Peter Kofler    schedule 26.06.2009
comment
вы имеете в виду NoClassDefFoundError, должно быть ошибкой, потому что она не подлежит восстановлению. Видимо ты прав - person akf; 26.06.2009
comment
Вы правы, я напечатал неправильно. исключение ClassNotFoundException запускается при попытке отразить класс, NoClassDefFoundError запускается, когда вы пытаетесь выполнить код в скомпилированном классе не в пути к классам во время выполнения - person Peter Kofler; 26.06.2009
comment
Исправлена ​​моя, спасибо 1. Хотя я нахожу удивительным, что это не вызывает каких-то ошибок / предупреждений: / - person akf; 28.06.2009
comment
Ошибка при экспорте в файл CSV - java.lang.NoSuchMethodError: com.lowagie.text.pdf.PdfPTable.completeRow () V
com.blox.table.action.ExportToCSVAction.actionPerformed (ExportToCSVAction.java:193) < br> 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 (Неизвестный Sou rce)
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 (Неизвестный источник) .pumpEvents (неизвестный источник)
java.awt.EventDispatchThread.pumpEvents (неизвестный источник)
java.awt.EventDispatchThread.run (неизвестный источник)
com.lowagie.text.pdf.PdfPTable.completeRow () V
com.blox.table.view.GridTableModel $ PdfExportWriter.writeNewLi ne (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 (неизвестный источник) - person Groxx; 14.01.2013

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

person Krishna Kumar    schedule 29.06.2009

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

person Community    schedule 28.06.2009

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

person mar    schedule 24.11.2010

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

person Stefanos Kargas    schedule 04.07.2011

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

person Armadillo    schedule 26.06.2009

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

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

person akf    schedule 26.06.2009

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

Мне помогло добавление к ответу «Последнего Палдина».

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

person Sean G    schedule 26.09.2012

Это первый метод, который вы вызываете из iText? Может быть, вставьте оскорбительный фрагмент кода ...

person Juma Wasike    schedule 05.11.2014