2

昨日、私は 1 つの質問を考えました。詳細は次のとおりです。

a.jarb.jarc.jarの3 つの JAR ファイルがあります。これらの jar ファイルには両方ともcom.test.Testという名前のクラスがあり、このクラスでsayHello()が定義されています。

Web アプリケーションを作成し、 a.jar,b.jar,c.jar を参照します。メインメソッドでは、sayHello(); を使用します。.この時点で、どの com.test.Test がロードされますか?

結果は a.jar です。

誰でも理由を教えてください?? 前もって感謝します!!!

4

4 に答える 4

3

それがJava言語仕様に書かれていることです。クラスパスで最初に出現するクラスをロードし、その他を無視します。

于 2012-09-25T20:54:18.613 に答える
1

どのクラスがロードされるかに焦点を当てるのではなく、JAR ファイル内の内容が適切に機能するためには、他の誰かのクラスではなく、おそらくそれらのクラスが必要であることに注意してください。 つまり、機能するシステムでは、 の代わりにfindを使用する方法を作成する必要があります。同じことが、よりも優先してクラスを見つける場合にも当てはまります。com.test.Test com.test.Testa.jara.jar's com.test.Testb.jarb.jar a.jar's

これを行う唯一の方法は、Java パッケージのメカニズムを超えて名前の間隔を追加するフレームワークを使用することです。通常、これは複数のクラスローダ (多くの場合、JAR ファイルごとに 1 つ) を使用して行われます。クロスローダー検出のルールを指定する必要がある場合、またはOSGiフレームワークに似たものを使用する必要がある場合、そのようなことを自分で作成することができます ( Tomcat が行いました)。

于 2012-09-25T21:11:35.363 に答える
0

クラスパスで最初に来るJarファイルが使用されます。CLASSPATH環境変数をJarファイルのパスに変更できます

以下のように変更するとします。

set CLASSPATH = %CLASSPATH%;.;a.jar;b.jar

次に、a.jarが使用されます..

次の方法で変更することもできます: -

set CLASSPATH = %CLASSPATH%;.;b.jar;a.jar

この場合、b.jar が使用されます。これらのコマンドは、Command Line..

** 注: - IDE を使用している場合、システム クラスパスは使用されません。使用している IDE に別のクラスパスを設定する必要があります。

于 2012-09-25T20:54:28.597 に答える
0

Eclipse などの IDE を使用している場合は、プロジェクトのプロパティでクラスパスを変更し、[ビルド パス] に移動すると、jar を上下に移動できる [注文とエクスポート] タブが表示されます。上の 1 つは、アプリケーションによって最初に取得されます。

これは、プロジェクトにある「classpath」というファイルを編集して手動で行うこともでき、アプリケーションで最初に使用する jar を先頭に移動します。

于 2012-09-25T21:18:22.453 に答える