如何在Java的运行时间设置ClassPath



可能的重复:
在运行时设置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,我将概述您需要注意的点:

  1. classloader表示命名空间(一部分),而不同的类负载器加载的两个其他相同的类并非"均等"。这意味着潜伏在上课中存在一些危险,特别是单身人士突然不再如此单身,并且出乎意料地失败了。
  2. classloaders(应该)在尝试任何任何东西之前(请参阅上文)。
  3. 类加载和链接是两个不同的步骤(即使class Loader的示例实现,例如在博客文章/在线Java文章中可以找到的,也会将两者合并为一个,以简单起见),因此,您不应该假设,如果父母是父母加载程序已经加载了一类,它也加载了所有依赖项...
  4. 所有这些意味着如果加载程序A加载A的类A类引用A类B类或其任何父母都无法加载的B类存在问题:A类可以在加载器A中加载良好因为装载机A无法完全解析(链接)。
  5. 您应该确保以同步的方式加载classloader,否则步骤#1中暗示的问题可以从重复方案中跃升,因为classloaders使用同一classloader,也可以从多个线程中重复出现...

注意:它是 far 更易于在某些包装脚本/批处理文件中使用-cp开关。

来自 ClassLoader#getSystemClassLoader() doc:

此方法首先在运行时的启动序列中调用, 在这一点上,它创建了系统类加载程序并将其设置为 调用线程的上下文类加载程序。

进行Thread.currentThread().setContextClassLoader(urlClassLoader)时,您正在更改当前线程中的参考,而不是ClassLoader中的参考线程将您的类加载的内容:

Thread.currentThread().getContextClassLoader().loadClass(...) 

最新更新