【问题标题】:Priority classloader in JavaJava中的优先类加载器
【发布时间】:2013-12-13 16:43:13
【问题描述】:

我想实现PriorityClassLoader,它可以做到以下几点:

  • 它接受默认的ClassLoader 实例作为构造函数参数
  • 它具有 addURL 方法,其工作方式类似于 URLClassLoader 中的 addURL,但它为每个新 URL 设置优先级。

当类应该被加载时,加载器首先会尝试使用默认的类加载器加载它,如果不是 - 根据优先级从提供的 URL 加载。有现成的解决方案吗?

PS - 我的原始问题如下 - 我想将 URL 添加到系统类加载器,但它开始在系统类加载器和远程 JAR 中的重复类上失败。

【问题讨论】:

  • 我宁愿统一 jar 版本或使用类似 OSGI 的东西

标签: java classloader


【解决方案1】:

我无意中发现了这个名为JCL 的有趣库,我是这样做的:

JarClassLoader jcl = new JarClassLoader();
jcl.add(new URL("hive://" + pageURL.getHost() + ":" + pageURL.getPort() + "/" + pageURL.getApplicationName() + "/origJar.jar"));

jcl.getSystemLoader().setOrder(1);
jcl.getThreadLoader().setOrder(2);
jcl.getCurrentLoader().setOrder(3);
jcl.getParentLoader().setOrder(4);
jcl.getLocalLoader().setOrder(5);

Thread.currentThread().setContextClassLoader(jcl);

【讨论】:

    【解决方案2】:

    为了回答这个问题,我从未听说过任何现成的解决方案,但可以通过一些自定义类加载器来完成,这是来自 blog post 的一个简化示例:

    public class ExampleFactory {
      public static IExample newInstance() {
        URLClassLoader tmp =
          new URLClassLoader(new URL[] {getClassPath()}) {
            public Class loadClass(String name) {
              if ("example.Example".equals(name))
                return findClass(name);
              return super.loadClass(name);
            }
          };
    
        return (IExample)
          tmp.loadClass("example.Example").newInstance();
      }
    }
    

    对于最初的问题,您是否尝试将您的库放在endorsed 目录中?这是一种 JDK 标准机制,允许在 JVM 引导类加载器级别添加库。

    根据您的服务器,将有其他选择放置类的位置。如果这些都没有帮助,那么最好提供有关原始问题的更多信息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-06-28
      • 1970-01-01
      • 2017-10-11
      • 2015-03-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多