Я хотел бы создать загрузчик класса parent-last/child-first, например. загрузчик классов, который сначала будет искать классы в классе класса loder, а затем делегирует ему родительский ClassLoader для поиска классов.
Разъяснение:
Теперь я знаю, что для того, чтобы получить полное разделение ClassLoading, мне нужно использовать что-то вроде URLClassLoader, передавая null, поскольку он является родителем, благодаря этому ответу в предыдущем вопросе
Однако текущий вопрос приходит мне на помощь, чтобы решить эту проблему:
-
Мои кодовые + зависимые банки загружаются в существующую систему, используя ClassLoader, который устанавливает этот System ClassLoader как родительский (URLClassLoader)
-
Эта система использует некоторые библиотеки версии, не совместимые с той, которая мне нужна (например, более старая версия Xerces, которая не позволяет мне запускать мой код)
-
Мой код работает отлично, если работает автономно, но он терпит неудачу, если выполняется из этого класса ClassLoader
-
Howerver Мне нужен доступ ко многим другим классам в родительском ClassLoader
-
Поэтому я хочу разрешить мне переопределять родительский класс "jars" с моим собственным: если класс, который я вызываю, найден в загрузчике дочерних классов (например, я предоставил более новую версию Xerces с моими собственными банками, а не один пользователь класса ClassLoader, который загрузил мой код и банки.
Вот системный код, загружающий мой код + 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 World" Flying Sauser):
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 более старой версии, и даже если я предоставляю правильную jerer Xerces в папке /addOns, так как она уже загружалась и использовалась родительской системой, она не позволяет мне код для использования моей собственной банки из-за направления делегации. Надеюсь, этот вопрос станет более ясным, и я уверен, что его спросили до. (Возможно, я не задаю правильный вопрос)