我想要创建一个父类-最后/子-第一类加载器,例如一个类加载器,它将首先在子类loder中查找类,然后委托它的父ClassLoader搜索类。
Clarification:
现在我知道了,为了获得完整的ClassLoading分离,我需要使用类似于URLClassLoader传递null作为它的父级的东西,这要归功于前面的问题中的这个答案
然而,目前的问题来帮助我解决这个问题:
以下是加载我的代码+ Jars的系统代码(我无法更改此代码)
File addOnFolder = new File("/addOns");
URL url = addOnFolder.toURL();
URL[] urls = new URL[]{url};
ClassLoader parent = getClass().getClassLoader();
cl = URLClassLoader.newInstance(urls, parent);
下面是“我的”代码(完全摘自"Hello“代码演示):
package flyingsaucerpdf;
import java.io.*;
import com.lowagie.text.DocumentException;
import org.xhtmlrenderer.pdf.ITextRenderer;
public class FirstDoc {
public static void main(String[] args)
throws IOException, DocumentException {
String f = new File("sample.xhtml").getAbsolutePath();
System.out.println(f);
//if(true) return;
String inputFile = "sample.html";
String url = new File(inputFile).toURI().toURL().toString();
String outputFile = "firstdoc.pdf";
OutputStream os = new FileOutputStream(outputFile);
ITextRenderer renderer = new ITextRenderer();
renderer.setDocument(url);
renderer.layout();
renderer.createPDF(os);
os.close();
}
}
这可以独立工作(运行main),但在通过父CL加载此错误时失败:
org.w3c.dom.DOMException: NAMESPACE_ERR:尝试以一种与名称空间有关的不正确的方式创建或更改对象。
可能是因为父系统使用旧版本的Xerces,而且即使我在/addOns文件夹中提供了正确的Xerces jar,因为父系统已经加载和使用了它的类,因此由于委托的方向,它不允许我自己的代码使用自己的jar。我希望这使我的问题更清楚,我相信这是以前的问题。(也许我没有问对的问题)
发布于 2011-03-26 22:38:36
通过阅读Jetty或Tomcat的源代码,它们都提供了父类加载器来实现webapp语义。
也就是说,通过重写findClass
类中的ClassLoader
方法。但既然你能偷,为什么要重新发明轮子呢?
通过阅读您的各种更新,我看到您在XML系统中遇到了一些典型的问题。
一般的问题是:如果您创建了一个完全隔离的类加载器,那么很难使用它返回的对象。如果允许共享,则当父版本包含错误的内容时,可能会出现问题。
正是为了应对所有这些疯狂,OSGi发明了,但这是一个大药丸吞咽。
即使在webapp中,类加载器也可以豁免一些包不受“本地优先”处理的影响,前提是容器和webapp必须就它们之间的API达成一致。
https://stackoverflow.com/questions/5445511
复制相似问题