Оператор DocumentBuilder.class загружает класс в System Classloader - PullRequest
0 голосов
/ 05 апреля 2020

Мы используем первый загрузчик классов Child, чтобы избежать конфликтов jar и загрузить классы по определенному пути. С загрузчиком службы и файлом xml -apis в пути к классу дочернего загрузчика классов мы сталкиваемся с проблемами.

xerces2 jars service loader создает объект javax. xml .parsers.DocumentBuilderFactory с org. apache .xerces.jaxp.DocumentBuilderFactoryImpl, если DocumentBuilderFactoryImpl отсутствует в классе classpath, загружает падение Rt.jar. При нормальных обстоятельствах код работает нормально.

При использовании дочернего загрузчика первого класса поверх системного загрузчика классов мы столкнулись с проблемами в следующих строках.

 DocumentBuilderFactory newInstance()

вышеуказанная строка используется для создания объекта. Подробности метода:

public static DocumentBuilderFactory newInstance() {
    return (DocumentBuilderFactory)FactoryFinder.find(DocumentBuilderFactory.class, "com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl");
}

Первый аргумент метода поиска,

DocumentBuilderFactory.class

создает объект класса для javax. xml .parsers.DocumentBuilderFactory class. но даже мы установили загрузчик классов с дочерним загрузчиком классов, оператор .class загружает класс с помощью системного загрузчика классов и создает объект класса, а не с текущим дочерним загрузчиком классов сверху

.

Внутри загрузчика службы создает объект для org. apache .xerces.jaxp.DocumentBuilderFactoryImpl с дочерним загрузчиком классов, а дочерний первый загрузчик классов загружает класс javax. xml .parsers.DocumentBuilderFactory.

Поскольку DocumentBuilderFactory.class загружен в системный загрузчик классов и org. apache .xerces.jaxp.DocumentBuilderFactoryImpl класс, загруженный в верхние дочерние загрузчики классов, не может быть назначен друг другу как оба javax. xml. parsers.DocumentBuilderFactory создается в отдельных загрузчиках классов.

Мой вопрос:

Есть ли способ избежать загрузки DocumentBuilder.class в системный загрузчик классов?

Для дочернего загрузчика первого класса мы используем следующую библиотеку https://github.com/kamranzafar/JCL/

...