barbitoff programmer`s blog

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

среда, 26 сентября 2012 г.

BIRT Report Viewer 4.2 на Tomcat 6: проблема с default workspace и объявлениями JDBC драйверов

Проблема:

На Tomcat 6 развернут BIRT Report Viewer 4.2 (просто взят и развернут WAR-ник из Birt Runtime). Однако при попытке просмотреть какой-либо отчет в интерфейс выдается невнятная ошибка:
Can not load the report query
, а в лог logs/ReportEngine_xxx.log, расположенный в корне веб-приложения, валится исключение:
SEVERE: Unable to open connection.
org.eclipse.datatools.connectivity.oda.OdaException ;
    java.lang.IllegalStateException: Unable to determine the default workspace location.  Check your OSGi-less platform configuration of the plugin or datatools workspace path.
...
Причина:

BIRT`у необходимо указать путь к default workspace`у, без него он работать не может (в простейшем случае workspace - просто пустая папка). Сделать это можно либо через переменную окружения, либо через системное свойство, второй способ, как по мне, более логичен. Для этого в init.d-скрипт томката (/etc/init.d/tomcat6) я добавил нужную опцию к уже имевшимся там ранее:
JAVA_OPTS="-Djava.awt.headless=true -Xmx256M -XX:MaxPermSize=512m -XX:PermSize=128m -XX:+UseConcMarkSweepGC
-Dorg.eclipse.datatools_workspacepath=$CATALINA_BASE/workspace_dtp"
Папку $CATALINA_BASE/workspace_dtp необходимо создать и убедиться, что у томката будут права на запись в неё.
Кстати, эта директория пригодится, чтобы, например, положить в неё файл с определениями JDBC-драйверов, без которых отчеты, использующие соединения с БД, будут валится с исключениями:
SEVERE: Unable to open connection.
org.eclipse.datatools.connectivity.oda.OdaException ;
    java.lang.Exception: Driver definition could not be found.
...
Caused by: java.lang.Exception: Driver definition could not be found.
...
Caused by: java.lang.Throwable: DriverConnectionBase.error.driverDefinitionNotFound
...
, даже если в самом отчете в <property name="jarList"> указан путь к jar-нику. Файл определения JDBC-драйверов называется driverStorage.xml и располагается в подпапке org.eclipse.datatools.connectivity. Его можно скопировать с машины, на которой производится разработка отчетов, исправив пути к jar-никам драйверов (записи о ненужных драйверах можно удалить). Вот пример содержимого этого файла для одного единственного postgresql-драйвера:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<DataTools.PropertySets>
<propertySet iD="DriverDefn.org.eclipse.datatools.enablement.postgresql.postgresqlDriverTemplate.PostgreSQL JDBC Driver" keys="org.eclipse.datatools.connectivity.drivers.defnType jarList org.eclipse.datatools.connectivity.db.username org.eclipse.datatools.connectivity.db.driverClass org.eclipse.datatools.connectivity.db.databaseName org.eclipse.datatools.connectivity.db.password org.eclipse.datatools.connectivity.db.URL org.eclipse.datatools.connectivity.db.version org.eclipse.datatools.connectivity.db.vendor " name="PostgreSQL JDBC Driver" prop_jarList="/var/lib/tomcat6/workspace_dtp/postgresql-8.4-701.jdbc4.jar" prop_org.eclipse.datatools.connectivity.db.URL="jdbc:postgresql://localhost:5432/database" prop_org.eclipse.datatools.connectivity.db.databaseName="database" prop_org.eclipse.datatools.connectivity.db.driverClass="org.postgresql.Driver" prop_org.eclipse.datatools.connectivity.db.password="" prop_org.eclipse.datatools.connectivity.db.username="pg" prop_org.eclipse.datatools.connectivity.db.vendor="postgres" prop_org.eclipse.datatools.connectivity.db.version="8.x" prop_org.eclipse.datatools.connectivity.drivers.defnType="org.eclipse.datatools.enablement.postgresql.postgresqlDriverTemplate"/>
</DataTools.PropertySets>

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

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