1

いくつかのサードパーティの jar によってクラスパスを拡張するクラスローダーを作成したいと思います。現在、私のコードは次のようになっています。

public class Main {
    public static void main(String[] args) throws ClassNotFoundException {
        ClassLoader originalClassLoader = Main.class.getClassLoader();
        URL[] jarUrls = ...;
        ClassLoader customClassLoader =  URLClassLoader.newInstance(jarUrls, originalClassLoader);
        Class classFromJar = customClassLoader.loadClass("class.from.Jar");

        originalClassLoader.equals(classFromJar.getClassLoader()); // true
        customClassLoader.equals(classFromJar.getClassLoader()); // false
        // I want classFromJar.getClassLoader() to return customClassLoader
    }
}

問題は、使用したクラスのロードが正常に機能する場合でも、ロードされたクラスのClassLoader#loadClassメソッド#getClassLoaderがカスタムのクラスローダーではなく元のクラスローダーを返すことです。このような状態では、追加の jar を認識せず、依存関係をロードできないため、呼び出しclassFromJar.newInstance()がスローされます。ClassNotFoundExeptionoriginalClassLoaderclassFromJar

ロードされたクラスの結果に自分自身を伝播するカスタムクラスローダーを作成する方法はClass#getClassLoader?

-Djava.system.class.loader「java.class.path」システム プロパティまたは JVMスイッチをカスタマイズせずに、純粋に実行時にそれを実現したいと思います。

4

0 に答える 0