barbitoff programmer`s blog

Здесь я публикую заметки из программерской жизни: грабли, на которые мне случилось наступить, проблемы, для которых было найдено элегантное (или не очень) решение, а также все, с чем мне пришлось столкнуться и чем хотелось бы поделиться =)
PS Если хотите меня поблагодарить - на странице есть 3 места, чтобы это сделать =)
Показаны сообщения с ярлыком JAVA_ENDORSED_DIRS. Показать все сообщения
Показаны сообщения с ярлыком JAVA_ENDORSED_DIRS. Показать все сообщения

четверг, 1 сентября 2011 г.

java.lang.ClassCastException: org.apache.xerces.parsers.XIncludeAwareParserConfiguration cannot be cast to org.apache.xerces.xni.parser.XMLParserConfiguration

Проблема:
при попытке деплоя веб-сервиса на tomcat вываливается исключение типа: "com.sun.xml.ws.transport.http.servlet.WSServletException: WSSERVLET11: failed to parse runtime descriptor: java.lang.ClassCastException: org.apache.xerces.parsers.XIncludeAwareParserConfiguration cannot be cast to org.apache.xerces.xni.parser.XMLParserConfiguration".
Причина:
версия библиотеки Xerces API, используемая tomcat`ом, отличается от той, с которой собран war-ник.
Решение:
  • Удалить из war-ника библиотеку xerces-impl.jar вообще, если она не используется в коде веб-сервиса
  • Используя механизм endorsed-direcory, заставить сервер использовать необходимую версию   Xerces API (как это сделать, описано тут: http://barbitoff.blogspot.com/2011/09/axb-20-api-is-being-loaded-from.html)  

JAXB 2.0 API is being loaded from the bootstrap classloader, but this RI needs 2.1 API

Проблема: 
при попытке деплоя веб-сервиса на tomcat вываливается исключение типа:
JAXB 2.0 API is being loaded from the bootstrap classloader, but this RI (from jar:file:/C:/++tomcat/webapps/testWS/WEB-INF/lib/jaxb-impl.jar!/com/sun/xml/bind/v2/model/impl/ModelBuilder.class) needs 2.1 API. Use the endorsed directory mechanism to place jaxb-api.jar in the bootstrap classloader. (See http://java.sun.com/j2se/1.5.0/docs/guide/standards/)
Причина: 
версия библиотеки JAXB, используемая tomcat`ом, отличается от той, с которой собран war-ник (в данном случае, томкат использует 2.0, а веб-сервис использует 2.1).

Решение:
Вариант 1: Обновить JDK, используемый сервером, до версии, которая использует более новую JAXB.
Вариант 2: использовать endorsed-механизм:
  1. В какую-то диреторию положить необходимую для веб-сервиса версию библиотеки jaxb-api.jar
  2. Далее либо установить переменную окружения JAVA_ENDORSED_DIRS с путем к этой директории, либо залезть в catalina.bat (или sh), запускающий tomcat, и поменять в нём 
-Djava.endorsed.dirs="%JAVA_ENDORSED_DIRS%"
 на 
-Djava.endorsed.dirs="/path/to/my/endorsed/dir"

Jar-ники из этой директории будут переопределять те, которые используются jdk`ем по-умолчанию.