logo

18 июл. 2010 г.

BIP: деплоймент в JBoss 5.1

Следует помнить, что BI Publisher версии 10.1.3.4 поддерживает JBoss Application Server версии 4.0.
И если возникло желание использовать сервер версии выше (я исследовал возможность деплоя только в версии 5.1), то возникнут трудности.
Вот что пишется в server.log при попытке развернуть BIP «влоб»:


2010-07-18 17:35:48,765 INFO [org.jboss.web.tomcat.service.deployers.TomcatDeployment] (main) deploy, ctxPath=/xmlpserver
2010-07-18 17:35:49,046 ERROR [org.apache.catalina.core.ContainerBase.[jboss.web].[localhost].[/xmlpserver]] (main) Exception sending context initialized event to listener instance of class org.jboss.web.jsf.integration.config.JBossJSFConfigureListener
java.lang.ClassCastException: oracle.xml.jaxp.JXSAXParserFactory cannot be cast to javax.xml.parsers.SAXParserFactory
at javax.xml.parsers.SAXParserFactory.newInstance(SAXParserFactory.java:128)


Эта проблема связана с багом JBoss 5.
Суть в том, что в момент деплоя веб-приложения BIPublisher программа-деплоер начинает использовать имплементацию интерфейса SAXParserFactory из jar-архива xmlparserv2, относящегося к BIPublisher (класс oracle.xml.jaxp.JXSAXParserFactory), вместо родной имплементации – из архива %JBOSS_HOME%\lib\endorsed\xercesImpl.jar (класс org.apache.xerces.jaxp.SAXParserFactoryImpl).

Таким образом, программа-деплоер пытается создать экземпляр класса oracle.xml.jaxp.JXSAXParserFactory для чтения конфиг-файлов. Но это в итоге приводит к различным проблемам совместимости.

Для устранения проблемы нашел следующее решение:

1) добавить опцию запуска JVM сервера в предпоследнюю строку файла %JBOSS_HOME%\bin\run.conf.bat

set "JAVA_OPTS=%JAVA_OPTS% -Djavax.xml.parsers.SAXParserFactory=org.apache.xerces.jaxp.SAXParserFactoryImpl"

тем самым мы жестко задаем класс, который будет реализовывать интерфейс SAXParserFactory на уровне всей JVM, а не конкретных jar (как это сделано в xercesImpl.jar или xmlparserv2: в папке META-INF/services/ javax.xml.parsers.SAXParserFactory)

2) в каталоге %JBOSS_HOME%\server\default\deploy\xmlpserver.war\WEB-INF
создадим файл jboss-web.xml
с содержимым:


<?xml version="1.0"?>
<!DOCTYPE jboss-web PUBLIC
"-//JBoss//DTD Web Application 5.0//EN"
"http://www.jboss.org/j2ee/dtd/jboss-web_5_0.dtd">
<jboss-web>
<class-loading java2ClassLoadingCompliance='true'>
</class-loading>
</jboss-web>

Здесь мы изолируем классы веб-приложения от серверных.
Причем я не совсем понял документацию.
Судя по пункту «Isolation with Overriding Server Classes» (отсюда)
атрибут java2ClassLoadingCompliance должен выставляться в false, но у меня стало работать только при true. (Если кто-то прояснит для меня ситуацию – буду очень признателен.)

После произведенных манипуляций BI Publisher успешно развернулся и даже стал работать =)

Комментариев нет:

Отправить комментарий