2012-02-02 14 views
1

jarファイルを実行時にクラスパスに追加する方法については、いくつかの投稿があります: - 現在のシステムクラスパスを取得してください。 - URLClassLoaderであるとします。 - リフレクションを使用して、保護されたaddURLメソッドのアクセスを設定します。 - 上記のメソッドを使用して、クラスパスにURLを追加します。ここでリフレクショントリックを使わずに実行時にクラスパスにjarファイルを追加する

は一例です: Adding files to java classpath at runtime

これは "厄介なハック" のように見える2と3段階のだから。

URLClassLoaderを拡張して現在の状態に設定するにはどうすればよいですか?私はクラスローダで少し混乱していて、次を試してみました:

public static void main(String... args) { 
    URLClassLoader loader = new URLClassLoader(new URL[]{new URL("file:jxl.jar")}); 
    System.out.println(loader.loadClass("jxl.Workbook")); 
    Thread.currentThread().setContextClassLoader(loader); 
    System.out.println(Class.forName("jxl.Workbook")); 
} // main 

秒がうまく動作しながら、私は、4行目にClassNotFoundExceptionを取得します。 (どうしてそうですか?)

答えて

2

Class.forNameメソッドでは、スレッドコンテキストクラスローダーではなく、「現在のクラスのクラスローダーを定義しています」メソッドが使用されます。あなたのケースではClassLoaderClass.forNameがアプリケーションをロードしたもの、つまりsystem class loaderを使用します。これは、クラスパス内のリソースを探すクラスローダーです。

+0

ああ...ありがとう...私はそれを忘れてしまった。しかし、もし私が4行目をSystem.out.println(jxl.Workbook.class)に変更するとどうなりますか? - 確かに、私はimport jxl。*をコンパイル中に提供するべきです - 実行時にも動作しません。 –

+0

その場合、クラスパスにjxl.Workbookをコンパイルする必要があります。 jxl.Workbookなしで実行しようとすると、JVMはクラスをロードするときにNoClassDefFoundErrorをスローします – Joni

+0

ああ、違う種類のエラーです。私は今、少しはっきりしていると思う。説明ありがとうございます! –

関連する問題