В Linux используется среда WAS 6.1, развертывание webapp, использующего классы из 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, то же самое, что был в classpath, когда приложение было скомпилировано.
При запуске webapp, когда Spring пытается разобрать свои конфиги, он броски:
java.lang.VerifyError: class loading constraint violated
(class: org/apache/xerces/jaxp/DocumentBuilderImpl
method: parse(Lorg/xml/sax/InputSource;)Lorg/w3c/dom/Document;)
АНАЛИЗ SO FAR
Похоже, что 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.*
,
так что это, вероятно, где classloader разрешает ссылку.
ЗДЕСЬ ЧАСТЬ ВЕРЫ:
Если мы сначала перейдем к "загрузчику родительского класса", мы не увидим исключение. Это противоречит ожидаемому поведению. Мы ожидаем, что с "application classloader first", он будет использовать xercesImpl.jar, чтобы мы и использовать версию WAS, только если мы установили "родительский загрузчик классов" сначала ". Это, кажется, назад от того, что мы видим на самом деле.
ВОПРОС:
Как параметр делегирования загрузчика классов, взаимодействующий с вышеуказанной информацией, приводит к наблюдаемому поведению?