Мы используем первый загрузчик классов 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/