LinkageError JAXB 2.0 -> 2.1 (Tomcat)

Я получаю эту ошибку при попытке получить доступ к моему веб-сервису, запущенному внутри tomcat.

Причина: java.lang.LinkageError: API JAXB 2.0 загружается из загрузчика классов начальной загрузки, но этот RI (из jar:file:/C:/software/tomcat6/webapps/messaging/WEB-INF/lib/jaxb-impl-2.1.5.jar!/Com/sun/xml/bind/v2/model/impl/ModelBuilder.class) требуется API 2.1. Используйте одобренный механизм каталогов, чтобы поместить jaxb-api.jar в загрузчик классов начальной загрузки. (См. http://java.sun.com/j2se/1.5.0/docs/guide/standards/)

Я погуглил ошибку и сделал то, что должно ее исправить (я поместил jaxb-api.jar, версия 2.1 в JDK/lib/endorsed и JDK/jre/lib/endorsed), но, похоже, это не имеет никакого эффекта.

У меня не было этого раньше, и я не уверен, что изменилось. Я использую JDK 6u10.

3 ответа

Решение

Java 6u10 включает в себя JAXB 2.1, поэтому нет необходимости включать его вообще (он был включен с 6u4).

Прямо сейчас кажется, что у вас есть конфликт между JAXB, включенным в веб-приложение, и JAXB в комплекте, который поставляется с JRE. Вы можете попробовать удалить банку JAXB из вашего веб-приложения (C:/software/tomcat6/webapps/messaging/WEB-INF/lib/jaxb-impl-2.1.5.jar) и положитесь на встроенную версию.

Рекомендуемый способ - определить переменную среды JAVA_ENDORSED_DIRS. Тогда Tomcat будет использовать это свойство Java:

-Djava.endorsed.dirs=$JAVA_ENDORSED_DIRS

для того, чтобы загрузить одобренные банки. Итак, создайте папку, поместите туда jaxb-api.jar v2.1 и определите переменную среды, которая будет указывать на эту папку.

Это лучше, чем использование глобального одобренного каталога, потому что это не влияет на всю JVM, и вам не нужно повторять процесс при обновлении JRE.

Возможно, у вас есть jaxb jar в каталоге $JAVA_HOME/jre/lib/ext? Вот определение загрузчика начальной загрузки:

Bootstrap - этот загрузчик классов содержит основные классы времени выполнения, предоставляемые виртуальной машиной Java, а также любые классы из файлов JAR, представленные в каталоге системных расширений ($JAVA_HOME/jre/lib/ext). ПРИМЕЧАНИЕ. - Некоторые JVM могут реализовать это как более чем один загрузчик классов, или он может вообще не быть видимым (как загрузчик классов).

(Принято здесь)

Найдите все места, где у вас есть jaxb jar в системе (по крайней мере, jaxb-api и jaxb-impl), и убедитесь, что они находятся либо в каталоге WEB-INF/lib вашего веб-приложения, либо в каталоге lib кота.

Другие вопросы по тегам