可能的重复:
在运行时设置classpath
可能的重复:在运行时设置类路径
要获得我正在使用的类路径:
ClassLoader cl = ClassLoader.getSystemClassLoader();
URL[] urls = ((URLClassLoader)cl).getURLs();
for(URL url: urls){
System.out.println("classpath:"+url.getFile());
}
可以在运行时帮助我使用代码将罐子加载到ClassPath中。
ClassLoader currentThreadClassLoader
= Thread.currentThread().getContextClassLoader();
URLClassLoader urlClassLoader
= new URLClassLoader(new URL[]{new File("D:\ms.jar").toURL()},
currentThreadClassLoader);
Thread.currentThread().setContextClassLoader(urlClassLoader);
这似乎有效。
一个完整的(编码)解决方案将超出单个堆栈溢出答案,因此,如果您决定编写自己的ClassLoader,我将概述您需要注意的点:
- classloader表示命名空间(一部分),而不同的类负载器加载的两个其他相同的类并非"均等"。这意味着潜伏在上课中存在一些危险,特别是单身人士突然不再如此单身,并且出乎意料地失败了。
- classloaders(应该)在尝试任何任何东西之前(请参阅上文)。
- 类加载和链接是两个不同的步骤(即使class Loader的示例实现,例如在博客文章/在线Java文章中可以找到的,也会将两者合并为一个,以简单起见),因此,您不应该假设,如果父母是父母加载程序已经加载了一类,它也加载了所有依赖项...
- 所有这些意味着如果加载程序A加载A的类A类引用A类B类或其任何父母都无法加载的B类存在问题:A类可以在加载器A中加载良好因为装载机A无法完全解析(链接)。
- 您应该确保以同步的方式加载classloader,否则步骤#1中暗示的问题可以从重复方案中跃升,因为classloaders使用同一classloader,也可以从多个线程中重复出现...
注意:它是 far 更易于在某些包装脚本/批处理文件中使用-cp
开关。
来自 ClassLoader#getSystemClassLoader()
doc:
此方法首先在运行时的启动序列中调用, 在这一点上,它创建了系统类加载程序并将其设置为 调用线程的上下文类加载程序。
进行Thread.currentThread().setContextClassLoader(urlClassLoader)
时,您正在更改当前线程中的参考,而不是ClassLoader
中的参考线程将您的类加载的内容:
Thread.currentThread().getContextClassLoader().loadClass(...)