有几篇关于如何在运行时通过以下想法将jar文件添加到classpath的帖子: - 获取当前系统类路径; - 假设它是URLClassLoader; - 使用反射为受保护的addURL方法设置访问权限; - 使用提到的方法将url添加到classpath。
这是一个例子: 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
我在第四行得到ClassNotFoundException,而第二行正常。 (顺便说一句,为什么会如此?)
答案 0 :(得分:2)
Class.forName
方法使用“定义当前类的类加载器”,而不是线程上下文类加载器。在您的情况下,ClassLoader
将使用的Class.forName
是加载您的应用程序的{{1}},即system class loader。这是一个在类路径中查找资源的类加载器。