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