如何从java在运行时设置类路径

如何从java在运行时设置类路径,java,Java,可能重复: 可能重复: 要获取我正在使用的类路径,请执行以下操作: ClassLoader cl = ClassLoader.getSystemClassLoader(); URL[] urls = ((URLClassLoader)cl).getURLs(); for(URL url: urls){ System.out.println("classpath:"+url.getFile()); } 有人能帮我在运行时在类路径中加载J

可能重复:

可能重复:

要获取我正在使用的类路径,请执行以下操作:

 ClassLoader cl = ClassLoader.getSystemClassLoader();
     URL[] urls = ((URLClassLoader)cl).getURLs();
     for(URL url: urls){
         System.out.println("classpath:"+url.getFile());
         }
有人能帮我在运行时在类路径中加载JAR的代码吗

ClassLoader currentThreadClassLoader
     = Thread.currentThread().getContextClassLoader();
    URLClassLoader urlClassLoader
     = new URLClassLoader(new URL[]{new File("D:\\ms.jar").toURL()},
                          currentThreadClassLoader);
    Thread.currentThread().setContextClassLoader(urlClassLoader);
这似乎是可行的。

一个完整的(编码的)解决方案将有点超出单堆栈溢出的答案,因此,如果您决定编写自己的类加载器,我将概述您需要注意的要点:

  • 类加载器表示(部分)名称空间,由不同类加载器加载的两个相同的类并不“相等”。这意味着类加载中潜藏着一些危险,特别是单件突然变得不再那么单一,以及类型转换意外失败
  • 类加载器(classloader)应该在尝试任何事情之前(参见上文)将任务委托给“父”加载器
  • 类装入和链接是两个不同的步骤(即使在博客文章/在线Java文章中可以找到类装入器的示例实现,为了简单起见,它们将二者结合为一),因此您不应该假设如果父装入器装入了类,它也装入了所有依赖项
  • 所有这一切都意味着,如果加载程序a加载的类a引用了加载程序a或其任何父级都无法加载的类B,则会出现问题:类a可能在加载程序a中加载得很好,但在使用时它会失败,因为加载程序a无法完全解析(链接)它
  • 您应该确保类加载器以同步的方式加载类,否则步骤#1中暗示的问题可能会从类加载器的重复问题跳到使用同一类加载器的多个线程的重复问题
  • 注意:只需在程序的某些包装器脚本/批处理文件中使用
    -cp
    开关,就更容易了。

    来自文档:

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

    当您执行
    Thread.currentThread().setContextClassLoader(urlClassLoader)
    时,您正在更改当前线程中的引用,而不是
    ClassLoader
    中的引用(并且您无法更改此引用),因此从那时起,您应该依靠当前线程的新类加载器来加载类,例如:

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

    在应用程序启动之前适当地设置类路径,并使JAR成为其中的一部分。我看不出这是不够的理由。JAR的运行时加载是针对应用程序服务器的,而不是针对你和我。如果我开发一个应用程序,一次加载插件,将使用建议的机制,类路径可能很重要,可能会重复:“这似乎很有效。”。例外情况?@Alban虽然不是1:1的副本,但这绝对是他“谷歌搜索”时应该找到的答案。