いくつかのサードパーティの 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()
がスローされます。ClassNotFoundExeption
originalClassLoader
classFromJar
ロードされたクラスの結果に自分自身を伝播するカスタムクラスローダーを作成する方法はClass#getClassLoader
?
-Djava.system.class.loader
「java.class.path」システム プロパティまたは JVMスイッチをカスタマイズせずに、純粋に実行時にそれを実現したいと思います。