Вы видите, что сервер приложений загружает библиотеки JBoss и библиотеки EAR в отдельные загрузчики классов
Вы можете представить себе иерархию загрузчика классов EAR, похожую (но не обязательно) на:
Bootstrap ClassLoader -> Загрузчик класса системы -> Загрузчик класса системы JBoss -> Загрузчик класса уха -> Загрузчик класса войны.
Где родительский класс загрузчика класса войны - это загрузчик класса уха и т. Д.
Теперь, если в Bootstrap ClasssLoader загружен jar A, а ухо также используется с jar A, у Bootstrap Class Lodaer и Ear Class Loader будет один и тот же класс, созданный дважды в отдельных загрузчиках классов.
Я бы предположил (не уверен на 100%), что JBoss 4 не поставлялся в комплекте с javax / xml / namespace / QName.Если это так, то JBoss 5 более вероятно является другой, обновленной версией Java (4 -> 5 или 5 -> 6).В результате (с новым JBoss 5), когда вы пытаетесь передать javax / xml / namespace / QName в один из ваших классов, он ожидает, что класс будет слышен.Однако вы предоставляете ему класс QName из загрузчика классов Bootstrap из-за предпочтений загрузчика классов (сначала родительский и т. Д.).
Поскольку типы классов равны, но экземпляры классов не равны, вы получаете LinkageError
Редактировать:
Просто два адреса двух комментариев -
Поведение загрузки класса, как отметил jtahlborn, определенно отличается.В обычных приложениях системные классы, такие как QName, будут последовательно искать в загрузчике классов начальной загрузки.В вашей ошибке это выглядит так, как будто javax / xml / datatype / DatatypeConstants загружается в org / jboss / classloader / spi / base / BaseClassLoader.Предположим, что это загрузчик классов EAR (или WAR).Быстрый Google показывает, что является частью семейства xml-apis и, возможно, jaxp-api.
Таким образом, где-то в вашем коде (или другом коде библиотеки, расположенном в загрузчике классов EAR) требовались DatatypeConstants - что заставило поиск класса в загрузчике классов EAR.Создание объекта QName, хотя и загружало класс из загрузчика классов начальной загрузки (вместо EAR).Это может произойти, если класс QName уже был инициализирован системой, что, вероятно, имеет.
Как вы можете себе представить, этого не произойдет.Похоже, у вас последний родитель.Потому что при загрузке класса из механизма загрузки классов JBoss, если бы был включен родительский элемент, начальные DatatypeConstants возвращали бы родительские (bootstrap) DatatypeConstants, а не дочерние элементы.Поэтому, как отметил jtahlborn, вы бы хотели, чтобы детский загрузчик классов здесь игнорировался.
Что касается разрешения, то если вам не нужны зависимости по определенной причине (например, более новая версия лучше текущей), то яделегировал бы реализацию jboss.Если это не так, вы можете взглянуть на элемент class-loading java2ClassLoadingCompliance
, который есть в конфигурации jboss.