В Linux используется среда WAS 6.1, в которой развертывается веб-приложение, использующее
классы из xercesImpl.jar.
Из-за ограничений политики компании приложение должно быть развернуто с
Настройки:
Class Loader Order
Classes loaded with parent class loader first
-> Classes loaded with application class loader first
WAR class loader policy
Class loader for each WAR file in application
-> Single class loader for application
Файл WAR содержит копию файла xercesImpl.jar, того самого файла, который
был в пути к классам, когда приложение было скомпилировано.
При запуске веб-приложения, когда Spring пытается разобрать его конфиги, оно
броски:
java.lang.VerifyError: class loading constraint violated
(class: org/apache/xerces/jaxp/DocumentBuilderImpl
method: parse(Lorg/xml/sax/InputSource;)Lorg/w3c/dom/Document;)
АНАЛИЗ ТАК ДАЛЕЕ
Похоже, что WAS обеспечивает реализацию
org.apache.xerces.jaxp.DocumentBuilderImpl, потому что мы можем удалить
xercesImpl.jar из файла WAR и по-прежнему выдает ту же ошибку (не
ClassNotFoundException). Таким образом, WAS, кажется, разрешает ссылки
используя свою собственную копию, которая несовместима с ссылками в нашем
скомпилированные файлы классов. Тем не менее, единственный другой экземпляр «xercesImpl.jar»
Я могу найти (кроме копии, развернутой с нашим приложением) в каталоге
deploytool
, который, кажется, находится за пределами сервера приложений.
Я отсканировал все банки в WAS (все 1300 из них) с
for i in `find . -name \*.jar`; do jar tvf $i|grep -qi xerces && echo $i ; done
и обнаружил, что ./java/jre/lib/xml.jar
содержит все классы в org.apache.xerces.*
,
так что это вероятно, когда загрузчик классов разрешает ссылку.
ЗДЕСЬ ЧАСТНАЯ ЧАСТЬ:
Если мы изменим на «родительский загрузчик классов первым», мы не увидим исключения.
Это идет вразрез с ожидаемым поведением. Мы ожидаем, что с
«Сначала загрузчик классов приложения» будет использовать файл xercesImpl.jar, который мы
и использовать версию WAS, только если мы установили «родительский загрузчик классов»
первый ". Это, кажется, назад от того, что мы на самом деле видим.
ВОПРОС:
Как параметр делегирования загрузчика классов взаимодействует с вышеуказанной информацией, чтобы привести к наблюдаемому поведению?