Java中的优先级类加载器

Java中的优先级类加载器,java,classloader,Java,Classloader,我想实现PriorityClassLoader,它可以执行以下操作: 它接受默认的ClassLoader实例作为构造函数参数 它有addURL方法,其工作方式类似于URLClassLoader中的addURL,但它为每个新URL设置优先级 当应该加载类时,loader first将尝试使用默认的classloader加载它,如果不是,则根据优先级从提供的URL加载。有现成的解决办法吗 PS-我最初的问题如下-我想向系统类加载器添加URL,但在系统类加载器和远程JAR中的重复类上它开始失败。回

我想实现
PriorityClassLoader
,它可以执行以下操作:

  • 它接受默认的
    ClassLoader
    实例作为构造函数参数
  • 它有
    addURL
    方法,其工作方式类似于
    URLClassLoader
    中的
    addURL
    ,但它为每个新URL设置优先级
当应该加载类时,loader first将尝试使用默认的classloader加载它,如果不是,则根据优先级从提供的URL加载。有现成的解决办法吗


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

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

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


根据您的服务器的不同,可能会有其他替代方案来放置类。如果这些都没有帮助,那么最好提供关于原始问题的更多信息

我偶然发现了一个有趣的库,名为,我是这样做的:

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

我宁愿统一jar版本,或者使用类似的东西
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);