【问题标题】:how to set classpath at runtime from java [duplicate]如何在运行时从java设置类路径[重复]
【发布时间】:2012-10-19 15:23:58
【问题描述】:

可能重复:
Setting CLASSPATH during runtime

可能重复:Setting CLASSPATH during runtime

获取我正在使用的类路径:

 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);

这似乎行不通。

【问题讨论】:

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

标签: java


【解决方案1】:

一个完整的(编码的)解决方案将有点超出一个 Stack Overflow 的答案,所以如果你决定编写自己的 ClassLoader,我将概述你需要注意的点:

  1. 类加载器代表一个命名空间(部分),并且由不同类加载器加载的两个其他相同的类不是“相等的”。这意味着在类加载中潜伏着一些危险,特别是单例突然不再那么单一以及强制转换意外失败。
  2. 类加载器(应该)在尝试自己做任何事情之前委托给“父”加载器的模式(见上文)。
  3. 类加载和链接是两个不同的步骤(尽管可以在博客文章/在线 Java 文章中找到类加载器的示例实现,但为简单起见,将两者合二为一)因此,您不应假设如果父loader 已经加载了一个类,它还加载了所有依赖项...
  4. 这意味着如果加载器 A 加载的类 A 引用加载器 A 或其任何父级都无法加载的类 B 时会出现问题:类 A 可能在加载器 A 中加载得很好,但在使用时它会失败因为加载器 A 无法完全解析(链接)它。
  5. 并且您应该确保您的类加载器以同步的方式加载类,否则在第 1 步中提示的问题可能会从由于类加载器导致的重复问题跳到使用相同类加载器的多个线程的重复...

注意:在您的程序的某些包装脚本/批处理文件中使用-cp 开关更容易。

【讨论】:

    【解决方案2】:

    来自ClassLoader#getSystemClassLoader() 文档:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-17
      • 1970-01-01
      • 2014-03-31
      • 2011-01-08
      • 1970-01-01
      • 2010-11-03
      相关资源
      最近更新 更多