2

依存関係としてさまざまなクラスとパッケージを含むプロジェクトがあります。以下に記述するすべてが 1 つのプロジェクトで発生することに注意してください。

ある時点でコードを実行するクラスがありますgetDiagramPanel().setRelationsPaintOrder(new Comparator() {

getDiagramPanel()DjtSheet.classは、依存関係の .jar ファイルにあるからメソッドを呼び出します。このメソッドはDjtDiagramPanelオブジェクトを返します。DjtDiagramPanel.javaパッケージのファイルをオーバーライドし、 method を含むファイルもありますsetRelationsPaintOrder()

Java 7 では、これは正常に機能します。依存関係からメソッドを正しく呼び出し、依存関係パッケージから panelclass をオーバーライドするクラスの形式でオブジェクトを返します。

ただし、Java 6 では、プロジェクトのパネルクラスではなく、依存関係パッケージのパネルクラスが返されます。

java.lang.NoSuchMethodError: com.dlsc.djt.gantt.DjtDiagramPanel.setRelationsPaintOrder(Ljava/util/Comparator;)V

このメッセージは実行時に発生することに注意してください。プロジェクトをコンパイルしてもエラーは発生しません。

どうすればこれを解決できますか?

4

1 に答える 1

-1

この問題は、クラスパスに問題があることを明確に意味します。問題は、クラスDjtDiagramPanelが重複していて、2 つの異なるバージョンがあることだと思います。1 つはメソッドを持ち、もう 1 つは持っsetRelationsPaintOrderていません。どうやら、「良い」バージョンに対してコードをコンパイルし、「悪い」バージョンに対して実行するようです。

これが発生した場合、おそらくEclipseのプロジェクトプロパティの依存関係の順序をいじってクラスのロードの順序を変更できますが、後で(本番環境で)失敗するだけです。したがって、重複の根本原因は何かを見つける必要があります。

まず、同じクラスのこれら 2 つのバージョンを見つけます。次に、不良バージョンがクラスパスに到達した方法を見つけます。通常、サードパーティの依存関係が原因で発生します。Maven を使用している場合は、依存関係プラグインを使用して根本原因を見つけ、タグ「除外」を使用して無効にすることができます。

于 2014-02-10T09:35:18.200 に答える