реализовать дочерний загрузчик первого класса:

ел бы создать загрузчик класса parent-last / child-first, например, загрузчик классов, который сначала будет искать классы в дочернем загрузчике классов, и только потом делегировать его родительскому ClassLoader для поиска классов.

Разъяснение:

Теперь я знаю, что для полного разделения ClassLoading мне нужно использовать что-то вроде URLClassLoader, передавая null в качестве родителя, благодаряэтот ответ на мой предыдущий вопрос

Однако текущий вопрос помогает мне решить эту проблему:

Мой код + зависимые банки загружаются в существующую систему с использованием ClassLoader, который устанавливает ClassLoader этой системы в качестве его родителя (URLClassLoader)

Эта Система использует некоторые библиотеки версии, несовместимой с той, которая мне нужна (например, более старая версия Xerces, которая не позволяет мне запускать мой код)

Мой код работает отлично, если работает автономно, но не работает, если запускается из этого ClassLoader

Однако мне нужен доступ ко многим другим классам в родительском ClassLoader

Поэтому я хочу разрешить мне переопределить родительский загрузчик классов «jar» с моим собственным: если в загрузчике дочернего класса обнаружен вызываемый мной класс (например, я предоставил более новую версию Xerces со своими собственными jar-файлами, а не с одним пользователем) 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);

Вот код "my" (полностью взят из демонстрационной версии кода 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 более старой версии, и хотя я предоставляю правильный jar-файл Xerces в папке / addOns, поскольку его классы уже загружены и используются родительской системой, она не позволяет моему собственному коду использовать мой собственный сосуд из-за направления делегации. Я надеюсь, что это проясняет мой вопрос, и я уверен, что он задавался раньше. (Возможно, я не задаю правильный вопрос)

Ответы на вопрос(5)

Ваш ответ на вопрос