jar/クラスに特定のメソッドがある場合でも、java.lang.NoSuchMethodError が発生するのはどのような場合ですか

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

  •  20-08-2019
  •  | 
  •  

質問

アプレットでの PDF エクスポートを容易にするために IText ライブラリを使用しています。エクスポート呼び出し中に、次のエラーが発生して失敗します。

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

JD Decompiler で Itext jar/PdfPtable.class を開いて、クラスに public メソッドとして completeRow があることを確認しました。

誰かが考えられるシナリオを説明してもらえますか? java.lang.NoSuchMethodError jar/クラスがそれを持っている場合でもスローされますか?

これがスタック トレースです。ほとんどの呼び出しはアプリケーション固有であるため、あまり役に立たないかもしれません。

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.mouseリリース(ソース不明)
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(ソース不明)
スピン.Invocation.evaluate(Invocation.java:175)
スピン.オフ.SpinOffEvaluator$1.run(SpinOffEvaluator.java:108)
java.lang.Thread.run(ソース不明)

役に立ちましたか?

解決 3

私は、サードパーティのjarファイルの一つはiTextのライブラリの古いバージョンをバンドルしていることが分かった。

他のヒント

これは、異なるバージョンがクラスパスに表示されたりすることを可能性があり、特定のメソッドのシグネチャは、コンパイル済みのクラスから変更されたことを

  1. 通常、このような問題は、コンパイルに使用した (前述のように逆コンパイルした) バージョンよりも前の、クラスパス内に問題のあるクラスの別のバージョンが存在する場合に発生します。これは、クラスパスの問題が一般的であるため、特に専門家の間でも頻繁に発生します。コンテナ内では、ロードされたライブラリの順序は指定されていません。

    したがって、IDE で iText 1.a を使用し、それに対してコンパイルするとします。次に、iText 1.b がプリインストールされているコンテナにアプリケーションをデプロイします。プリインストールされたライブラリが優先され、b < a の場合、この種の問題が発生します。

    あなたのケースにはコンテナはありませんが、パッケージ化/デプロイ中にライブラリのバージョンを混同したり、開発と実行に異なるクラスパスを使用したりする可能性があります。

  2. jar は実行時にはクラスパスに存在せず、コンパイル時にのみ存在します。しかし、その後、あなたは NoClassDefFoundError iText が初めてアクセスされたときはそうではありません。

  3. iText 自体がサードパーティのライブラリを欠落している場合は、 NoClassDefFoundError 満たされていない依存関係を必要とするメソッドを呼び出すとき。

これはPdfPTableがあなたのクラスパスにあるクラスの2つのバージョンを意味します。使用している2つのJARファイルには、同じクラスの異なるバージョンをパッケージ化した可能性があります。把握するための簡単な方法は、あなたのクラス名のJARクラスパスにjarファイルに-tf、とgrepを行うことです。古いバージョンを削除するか、あなたのクラスパスにjarファイルの順序を変更してます。

私は、NetBeans IDEを使用していますし、私はこの問題にいくつかの時間を有していました。私は、メソッドのパラメータを変更する場合、たとえば、それはもう動作しませんでした!偶然、私はプロジェクトを右クリックして「クリーン」を押した場合は、この方法を変更した後、何も問題はもうなかったことを理解!

私は同じ問題を抱えていたと私は削除して構築プロジェクトボタンを押すと、すべてが今、素晴らしい作品。多分時々以前から立ち往生している問題は、構築し、再構築する必要があります。

また、jarファイルの2つのバージョンが、アプレットのクラスパスとあなたのコードがコンパイルされたものとは異なる署名を持ってロードされてしまっ1に表示されているかもしれません。

おそらくこのクラスの別のバージョンを使用すると、逆コンパイルバージョンの前にクラスパスにあります。
編集またはのパッケージを更新しましたが、あなたの実行時クラスパスに展開したり、ランタイムENVが同期していない、つまりあなたは、コンパイルのクラスパスを更新しhaventはどちらかに忘れていましたあなたのコンパイル時ENVでます。

public void completeRow()は2.0.5で導入されました。あなたは、ランタイム・クラスパスに2.0.5以前のバージョンを持っている必要があります。それでもこの問題が発生している場合は、プロセスの起動にクラスパスを検討してください。前に述べたように、あなたは2.1.5バージョンでコンパイルされます。

これは私のために働いています。

私はネット豆のIDEを使用します。私は単純にHTTPClientおよびコアjarファイルを削除した(私は4.2.1を使用しています)し、それらを再追加します。それは順序を変えたようだったし、それが働きました。

私を助けてくれ "最終Paldinの" 回答に加えます。

はやや同様の問題があった、より深い調査に私が追加したサードパーティ製の瓶のテーブルクラスメソッドは、iTextの-2.0.4瓶の対応テーブル方式と競合していることに気づきました。だから私は、クラスパスとライブラリフォルダからサードパーティのjarファイルを削除して再構築し、クリーンを実行し、今では完全にレンダリングされます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top