【问题标题】:JasperReport load font extensionJasperReport 加载字体扩展
【发布时间】:2015-04-20 13:47:33
【问题描述】:

我不使用 JasperServer,而是直接使用 JasperReport 4.0.2 创建了一个 webapp。

模板不在默认类加载器中,有添加,在调用 JasperReport 之前使用ContextClassLoader

在 Jasper Report 的最新版本中,字体管理已更改,如 this document 所示。因此,我需要提供字体 JAR,当我将它们直接放在 WEB-INF/lib 目录中时,它可以工作。

但是,出于模块化原因,我想使用与模板相同的 ContextClassloader 将它们添加到类路径中,但在这种情况下,文本不会以正确的字体呈现。

我确实认为这与 JasperReport 加载字体的方式有关。 使用调试器,我可以将其追溯到不返回相同结果的 net.sf.jasperreports.engine.util.getFontInfo(...) 方法。

这是因为ExtensionsEnvironment.getExtensionsRegistry().getExtensions(FontFamily.class) 在这两种情况下都不会返回相同的家庭列表。仅当 JAR 位于 WEB-INF/lib 中时才会加载扩展。

有人知道net.sf.jasperreports.extensions.getExtensionsRegistry() 可以如何用于检索threadRegistry 实例吗? (我猜必须以某种方式初始化)。

【问题讨论】:

    标签: jasper-reports


    【解决方案1】:

    这个问题似乎与http://jasperforge.org/plugins/espforum/view.php?group_id=102&forumid=103&topicid=76180重复

    当 JasperReport 加载扩展时(懒惰地,第一次使用),字体扩展使用 JasperReport 类加载器,而不是上下文类加载器。

     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 代码中使用的类加载器可以解决问题,但可能会对其他用例产生副作用。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-07
    • 1970-01-01
    • 1970-01-01
    • 2019-07-24
    • 1970-01-01
    • 2011-03-02
    相关资源
    最近更新 更多