2009-06-26 5 views
10

Sto utilizzando la libreria IText per facilitare l'esportazione di PDF in un'applet. Durante la chiamata di esportazione non riesce con errore seguente:Quando si ottiene java.lang.NoSuchMethodError anche quando jar/class ha il metodo particualar

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

ho aperto il barattolo iText/PdfPtable.class in JD Decompiler e ha confermato che la classe ha completeRow come un metodo pubblico.

Qualcuno può spiegare gli scenari possibili quando viene lanciato uno java.lang.NoSuchMethodError anche se jar/class lo ha?

Ecco la traccia dello stack; potrebbe non essere molto utile in quanto la maggior parte delle chiamate sono specifiche dell'applicazione.

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)

+0

È il primo metodo che chiamate da iText? Forse incolla il codice in questione ... –

+0

Non riesco a vedere questo metodo in iText 2.0.4. Quale versione hai? – akarnokd

+0

Sto usando la versione 2.1.5 di iText. Questa chiamata non è la prima; infatti, l'esportazione parziale in pdf ha successo. [ERRORE] com.blox.table.action.ExportToCSVAction.actionPerformed (ExportToCSVAction.java:215) - Errore durante l'esportazione nel file CSV - java.lang.NoSuchMethodError: com.lowagie.text.pdf.PdfPTable.completeRow () V java.lang.RuntimeException: errore durante l'esportazione nel file CSV - java.lang.NoSuchMethodError: com.lowagie.text.pdf.PdfPTable.completeRow() V –

risposta

4

ho scoperto che uno del terzo gruppo è stata vaso bundling una versione più vecchia di libreria iText

0

forse c'è un'altra versione di questa classe nel classpath prima della versione che è stata decompilata.
modificare: O aver aggiornato il pacchetto, ma avete dimenticato a uno distribuirlo al classpath runtime o havent aggiornato il classpath in fase di compilazione, vale a dire la vostra env runtime non è sincronizzato con il tuo env compiletime.

public void completeRow() è stato introdotto in 2.0.5. è necessario disporre di una versione precedente alla 2.0.5 nel percorso di classe di runtime. se si verifica ancora questo problema, si prega di studiare il classpath per l'avvio del processo. come detto prima, stai compilando la versione 2.1.5.

7

Potrebbe essere che una versione diversa appare nel classpath o che la firma di quel particolare metodo è cambiato da quando il vostro compilato la classe

7
  1. solito tali problemi sono perché se c'è un'altra versione del incriminata classe nel tuo classpath prima della versione che hai usato per la compilazione (e che hai decompilato come detto prima). Ciò accade spesso in quanto i problemi del classpath sono comuni, anche con esperti, esp. in contenitori, dove l'ordine delle librerie caricate non è specificato.

    Quindi diciamo che si utilizza iText 1.a nel proprio IDE e si compila contro. Quindi si distribuisce l'applicazione in un contenitore, dove è preinstallato iText 1.b. Le librerie preinstallate hanno la precedenza e quando b < a si incontra questo tipo di problema.

    Nel tuo caso non c'è un contenitore, ma puoi mescolare le versioni di librerie durante l'imballaggio/distribuzione o avere percorsi di classe differenti per lo sviluppo e l'esecuzione.

  2. Il jar non è nel classpath in fase di runtime, solo al momento della compilazione. Ma poi si otterrebbe un NoClassDefFoundError quando si accede a iText per la prima volta, il che non è il caso.

  3. Se iText stesso non si accorgerebbe di una libreria di terze parti, si riceverà anche un NoClassDefFoundError quando si chiama il metodo che richiede la dipendenza non soddisfatta.

+0

un ClassNotFoundException deve essere attivato da # 2 – akf

+0

si intende NoClassDefFoundError, deve essere un errore perché non è recuperabile. Forse hai ragione, –

+0

hai ragione, ho sbagliato la digitazione. una classe ClassNotFoundException viene attivata quando si tenta di riflettere su una classe, NoClassDefFoundError viene attivato quando si tenta di eseguire codice su una classe compilata non nel classpath in fase di esecuzione – akf

0

Potrebbe anche essere che due versioni del vaso appaiono nel classpath applet e quella che ha ottenuto caricata ha una firma diversa da quella che il codice è stato compilato con

2

Ciò significa due versioni la classe PdfPTable si trova nel tuo percorso di classe. Due file jar che stai utilizzando potrebbero avere confezionato versioni differenti della stessa classe.Un modo semplice per capire è fare un jar -tf sui file jar nel classpath e grep per il tuo classname. Rimuovere la versione obsoleta o modificare l'ordine dei file jar nel percorso della classe.

2

Sto usando NetBeans IDE ed ho avuto questo problema alcune volte. per esempio quando ho cambiato i parametri di un metodo, non ha funzionato più! Per inciso, ho capito che dopo aver cambiato il metodo, se facevo clic con il tasto destro del mouse sul progetto e facevo clic su "pulito", non c'erano più problemi!

1

Ho avuto lo stesso problema e ho premuto il pulsante Clean and Build Project e tutto ora funziona alla grande. Forse a volte il problema è bloccato dalle versioni precedenti e devi ricostruire.

0

Questo ha funzionato per me.

Io uso net bean IDE. Ho semplicemente cancellato i file jar httpclient e core (sto usando 4.2.1) e li ho ri-aggiunti. Sembrava cambiare l'ordine e ha funzionato.

Aggiunta alla risposta "Ultimo Paldino" che mi ha aiutato.

0

Avuto un problema simile, un'analisi più approfondita ha rilevato che un metodo di classe Table in un jar di terze parti che avevo aggiunto era in conflitto con il metodo di tabella corrispondente di jar itext-2.0.4. Così ho rimosso il vaso di terze parti dalla cartella classpath e dalle librerie e ho eseguito una ricostruzione pulita e ora il rendering è perfetto.

Problemi correlati