0

私のアプリケーションには、いくつかの機能を備えた 2 つの jar がありますが、バージョン番号が異なります。

-rwxr-xr-x 1 nobody nobody  87776 Jul 16 23:40 commons-io-1.3.2.jar
-rwxr-xr-x 1 nobody nobody 109043 Jul 16 23:35 commons-io-1.4.jar

1 つの jar 1.4.jar にはメソッド deleteQuietly() がありますが、下位バージョンの 1.3.1 jar にはメソッドがありません。

私のパズルは、メソッドを呼び出したときにエラーを報告するかどうかです。

シンボル symbol が見つかりません: メソッド deleteQuietly(java.io.File)

このケースが発生したときに、このエラーが発生しました。

4

2 に答える 2

0

これはクラスローダーの問題です。commons-io-1.3.2.jar をクラスパスから削除し、再度デプロイします。この jar を削除したくない場合は、maven を使用してクラスの読み込みの問題を回避してください。

于 2012-07-18T03:39:10.590 に答える
0

あなたが何を求めているのかは完全には明らかではありませんが、最善のアドバイスは単にそれをしないことです. コンパイル/ビルド時に JAR の 1 つのバージョンのみを使用し、実行時に同じバージョン (のみ) を使用します。

(両方向で) 100% 互換性がない API を持つ JAR の 2 つのバージョンがある場合、動作は、クラスパスで最初に来る JAR ファイルによって異なります。メソッドのないバージョンが最初に来ると、ビルド エラー (エラー メッセージにあるようなもの) または実行時エラーが発生します。


あなたがそれがうまくいくと思うかどうか、私は少し困惑しています。おそらく、Java はクラスの両方のバージョンをロードし、ある種の魔法を使って異なるバージョンからメソッドを選択すると思います。そのようには機能しません。Java は、検出したクラスの最初のバージョンをロードします。それ以外は黙って無視されます。

于 2012-07-18T03:34:06.647 に答える