Проблема с Джаспером и getCallerClassLoader () - PullRequest
2 голосов
/ 31 января 2011

Я пытаюсь получить во время выполнения ссылку на скомпилированный подотчет, который находится в том же каталоге, что и мой основной отчет.После нескольких часов поиска я попытался получить ссылку на файл в виде URL-адреса, используя следующее:

new String(
  ClassLoader.getCallerClassLoader().toString().substring( 
    ClassLoader.getCallerClassLoader().toString().indexOf("=") + 1, 
    ClassLoader.getCallerClassLoader().toString().lastIndexOf("/") ).toString() ) + 
  "/some.jar/com/foo/reports/ThatDamnedReport/ThatDamnedReport_subreport1.jasper"

Когда я отлаживаю, я могу изменить значение моей строки с помощью приведенного выше оператора, и это работает!Yay!

Задача 1

Мы используем предварительно скомпилированные файлы jasper, и я могу скомпилировать только до версии 3.1.4 (в противном случае остальная часть древнего кода ломается).«Стандартный» способ доступа к моему подотчету не работает, потому что я не могу найти относительный каталог к ​​своему подотчету.Мы не используем JasperServer.

Проблема 2

Когда я компилирую через iReport, я получаю сообщение об ошибке "метод getCallerClassLoader из типа ClassLoader не виден"

Поскольку я пытаюсь скомпилировать из файла JRXML, подклассы здесь не вариант.

Вопрос

Как мне получить файл для компиляции или как найти относительный путь к ThatDamnedReport_subreport1.jasper

1 Ответ

0 голосов
/ 04 февраля 2011

JasperReports использует абсолютный путь для поиска файлов.Чтобы обойти эту проблему, сделайте следующее:

  1. Создайте параметр DIR_ROOT.
  2. Назначьте значение по умолчанию для DIR_ROOT из /path/to/com/foo/reports/ (не внутри файла JAR;конечный слеш важен).
  3. Создайте параметр DIR_SUBREPORT.
  4. Определите DIR_SUBREPORT относительно $P{DIR_ROOT}.Например: $P{DIR_ROOT} + "ThatDamnedReport/" (оставить косую черту).
  5. Справочные подотчеты: $P{DIR_SUBREPORT} + "ThatDamnedReport_subreport1.jasper".

Когда вы запускаете отчет, если корневой каталог отличается, передайтеDIR_ROOT параметр для отчета.Это позволяет вам хранить подотчеты относительно корневого каталога и иметь разные корневые каталоги в разных средах.

...