JasperReport загрузить расширение шрифта - PullRequest
3 голосов
/ 28 февраля 2012

Я не использую JasperServer, вместо этого я создал веб-приложение, используя JasperReport 4.0.2 напрямую.

Шаблоны не находятся в загрузчике классов по умолчанию, они добавляются с использованием ContextClassLoader перед вызовом JasperReport.

В последней версии Jasper Report управление шрифтами изменилось, как указано в этого документа .Поэтому мне нужно предоставить JAR-файлы Font, которые работают, когда я помещаю их в каталог WEB-INF / lib напрямую.

Однако по соображениям модульности я хотел бы добавить их вclasspath использует тот же ContextClassloader, что и с шаблонами, но в этом случае тексты не отображаются с правильным шрифтом.

Я думаю, это как-то связано с тем, как JasperReport загружает шрифт.Используя отладчик, я мог отследить его до метода net.sf.jasperreports.engine.util.getFontInfo(...), который не возвращает тот же результат.

Это связано с тем, что ExtensionsEnvironment.getExtensionsRegistry().getExtensions(FontFamily.class) не возвращает один и тот же список семейства в обоих случаях.Расширения загружаются только тогда, когда JAR-файлы помещены в WEB-INF / lib .

Кто-нибудь знает, как net.sf.jasperreports.extensions.getExtensionsRegistry() может быть адаптирован для получения экземпляра threadRegistry?(должен быть как-то инициализирован, я думаю).

1 Ответ

1 голос
/ 29 февраля 2012

Эта проблема, кажется, дубликат http://jasperforge.org/plugins/espforum/view.php?group_id=102&forumid=103&topicid=76180

Когда JasperReport загружает расширение (лениво, при первом использовании), расширение шрифта использует JasperReport Classloader, а не загрузчик класса контекста.

 From JRLoader.getClassLoaderResources(String) line:
            Map<URL, ClassLoaderResource> resources =
                  new LinkedHashMap<URL, ClassLoaderResource>();
            collectResources(resource, JRLoader.class.getClassLoader(), resources);

JRLoader.collectResources затем получите список всех загрузчиков классов, итерируя по .getParent().

Используя Thread.currentThread().getContextClassLoader() вместо этого, обработка ошибок должна обеспечить расширенный загрузчик классов (для которого необходимо установить JRLoader.class.getClassLoader() в качестве родительского).

Изменение загрузчика классов, используемого в коде JasperReport, устраняет проблему, но может иметь побочные эффекты в других случаях использования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...