我想实现可以执行以下操作的PriorityClassLoader
:
ClassLoader
实例作为构造函数参数addURL
方法与addURL
中的URLClassLoader
类似,但对于每个新网址,它都设置了优先级。当应该加载类时,加载器首先会尝试使用默认的类加载器加载它,如果没有 - 根据优先级从提供的URL加载。有没有现成的解决方案?
PS - 我原来的问题是 - 我想将URL添加到系统类加载器中,但它在系统类加载器和远程JAR中的重复类上开始失败。
答案 0 :(得分: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);
答案 1 :(得分:0)
要回答这个问题,我从来没有听说过任何现成的解决方案,但可以通过一些自定义类加载器来完成,这是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引导程序类加载器级别添加库。
根据您的服务器,还有其他替代方法可以放置类。如果这些都没有帮助那么最好提供有关原始问题的更多信息。