Проблема загрузки классов в многомодульном приложении maven - PullRequest
0 голосов
/ 28 июня 2019

У меня есть многомодульное приложение maven.Внутри основного каталога, где находится родительский pom, у меня есть несколько модулей.Я в процессе добавления еще одного на том же уровне, что и другие модули.Приложение упаковано как EAR и развернуто в Websphere, этот EAR настроен на использование разделяемой библиотеки, которая в основном представляет собой каталог, содержащий файлы jar.В этой общей библиотеке находится Apache Crimson, который используется некоторыми модулями.Я добавляю новый модуль на основе Spring Framework 4.0.0.RELEASE.Весь проект является устаревшим и использует Java 6 и Hibernate 2.1 :(. Проблема заключается в том, что этот Crimson вызывает сбой моего нового модуля во время развертывания:

BeanDefinitionStoreException: исключение конфигурации парсера при разборе XML из ресурса ServletContext [/WEB-INF/spring/root-context.xml]; вложенное исключение - javax.xml.parsers.ParserConfigurationException: Невозможно проверить с помощью XSD: ваш поставщик JAXP [org.apache.crimson.jaxp.DocumentBuilderFactoryImpl@86b4 not4 не поддерживаетСхема XML. Работаете ли вы на Java 1.4 с Apache Crimson? Обновитесь до Apache Xerces (или Java 1.5) для полной поддержки XSD.

Поэтому я добавил в свой новый модуль следующее:

`<dependency>
    <groupId>xerces</groupId>
    <artifactId>xercesImpl</artifactId>
    <version>2.6.2</version>
</dependency`

Но приложение по-прежнему извлекает crimson.jar из общей библиотеки. Я пытался исключить этот crimson.jar из родительского pom, но все же он берется из общей библиотеки. Crimson требуется для некоторых других модулей, упакованных в виде jars, следовательно, crimsonприсутствует уровень EAR / lib. Еще одна попытка была изменить классoader - сначала взять банки из нового модуля, а затем перейти вверх по иерархии (мой новый военный модуль, затем родительское ухо).Но это дало мне еще одно исключение.Вопрос в том, как находясь в модуле WAR внутри модуля EAR, не взять банку с уровня уха (он также был включен в EAR / lib) и взять только с уровня WAR?

1 Ответ

0 голосов
/ 28 июня 2019

Если загрузка родительского последнего класса в WAR не работает (возможно, из-за чего-то еще в WAR, которое нельзя безопасно запустить с этим шаблоном делегирования), то я бы порекомендовал изолированную общую библиотеку, связанную с WAR. В административной консоли WAS создайте совместно используемую библиотеку с путем к классу, содержащим необходимые файлы анализатора, выберите параметр «использовать изолированный загрузчик классов для этой совместно используемой библиотеки», затем свяжите эту совместно используемую библиотеку с нужным веб-модулем. это.

Изолированные разделяемые библиотеки используют родительскую загрузку последнего класса, но только для jar-файлов в библиотеке, а не для всего EAR или WAR. Из-за этого вы можете настроить таргетинг только на банки, которые действительно НУЖНЫ использовать для делегирования такого типа. Изолированная библиотека должна позволять вам использовать Xerces в WAR, все еще используя Crimson в EAR.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...