3

Web アプリケーションがロードTomcatされると、特定のクラスローダーによってロードされますよね? この Web アプリケーションで使用される
すべてのライブラリ ( の下) は、すべてこの同じクラスローダーによってロードされると思いますか? この場合、問題なく別のクラスローダーでライブラリをロードする方法はありますか? これを行う理由は、クラスローダーにバインドされているいくつかの構成プロパティを使用し、さまざまなプロパティでリクエストを実行したいため、別のクラスローダーを使用するためです。 これは可能ですか?WEB-INF\lib

Axis

4

1 に答える 1

3

実行時にプログラムでクラスをロードする場合は、URLClassLoader を使用できますが、実際に正しく行うのは非常に難しい場合があります。次のようにします。

URL[] urls = new URL[] {
    /* URL to your axis jar */,
    /* other URLs you need */
};
URLClassLoader classLoader = new URLClassLoader(urls, getClass().getClassLoader());
Class<...> axisClass = classLoader.findClass(/* fully qualified name */);

その後、このクラスの新しいインスタンスを作成して使用できるようになります。

編集:設定が難しすぎるため、Axis を使用していませんが、より具体的な例を次に示します。次のクラスを含む JAR ファイルを作成しました。

public class Hello {
    public Hello(String config) {

    }

    public String getMessage() {
        return "Hello World";
    }
}

この jar ファイルをテスト プロジェクトのソース フォルダーにコピーしたので、UrlClassloaderTest.class.getResource("hello.jar"). Web アプリでは、おそらくそれを WebContent/WEB-INF (または同様のもの) に配置し、メソッドを使用してjavax.servlet.ServletContext.getRealPath("WEB-INF/hello.jar")それを見つける必要があります。次に、URLClassLoader とリフレクションを使用して Hello クラスにアクセスできます。

public class UrlClassloaderTest {
    public static void main(String[] args) throws Exception {
        URL jarUrl = UrlClassloaderTest.class.getResource("hello.jar");
        URLClassLoader cl = new URLClassLoader(new URL[] { jarUrl }, UrlClassloaderTest.class.getClassLoader());

        Class helloClass = cl.loadClass("test.Hello");
        Constructor constructor = helloClass.getConstructor(String.class);
        Object helloObject = constructor.newInstance("some configuration");
        Method messageMethod = helloClass.getMethod("getMessage");
        String message = (String) messageMethod.invoke(helloObject);

        System.out.println(message);
    }
}

Hello はアプリケーションのクラスパス上になく、クラスのクラスローダーに認識されないため、ここではタイプとして使用できないことに注意してくださいUrlClassLoaderTest

于 2012-11-14T06:55:10.373 に答える