【问题标题】:Jasper Reports fonts problem when stating in openjdk:15-alpineJasper 在 openjdk:15-alpine 中声明时报告字体问题
【发布时间】:2021-08-24 21:09:26
【问题描述】:

我知道有很多类似的问题,但我没有找到确切的情况

我有:

  1. Spring 启动应用程序
  2. pom.xml
<dependency>
  <groupId>net.sf.jasperreports</groupId>
  <artifactId>jasperreports</artifactId>
  <version>6.17.0</version>
</dependency>

<dependency>
  <groupId>net.sf.jasperreports</groupId>
  <artifactId>jasperreports-fonts</artifactId>
  <version>6.17.0</version>
</dependency>
  1. src/main/resources/jasperreports_extension.properties
net.sf.jasperreports.extension.registry.factory.fonts=net.sf.jasperreports.engine.fonts.SimpleFontExtensionsRegistryFactory
net.sf.jasperreports.extension.simple.font.families.myfamily=fonts/myfamily.xml

  1. src/main/resources/fonts/myfamily.xml
<?xml version="1.0" encoding="UTF-8"?>
<fontFamilies>
    <fontFamily name="Tahoma">
        <normal><![CDATA[fonts/Tahoma/tahoma.ttf]]></normal>
        <pdfEncoding><![CDATA[Cp1251]]></pdfEncoding>
        <pdfEmbedded><![CDATA[true]]></pdfEmbedded>
        <exportFonts/>
        <locales>
            <locale><![CDATA[ru_RU]]></locale>
        </locales>
    </fontFamily>
</fontFamilies>

  1. src/main/resources/fonts/Tahoma/tahoma.ttf

一切正常!在本地使用 ADOPT-OPENJDK-15 开始时(对不起大写)

在服务器上启动时出现问题,在 docker 中我的应用程序以 openjdk:15-alpine 启动,默认情况下只包含一些字体https://wiki.alpinelinux.org/wiki/Fonts

我遇到了两个错误 第一次击球时:

java.lang.UnsatisfiedLinkError: /opt/openjdk-15/lib/libfontmanager.so: Error loading shared library libfreetype.so.6: No such file or directory (needed by /opt/openjdk-15/lib/libfontmanager.so)

当第二次命中时(每次都会出现以下错误)有趣的是,为什么总是第一次出现一个错误,第二次和其他时候出现另一个错误

java.lang.NoClassDefFoundError: Could not initialize class net.sf.jasperreports.engine.util.JRStyledTextParser] with root cause

我尝试了一些解决方案

  1. 将 JAVA_OPT 添加到 docker 容器中
-Djava.awt.headless=true 
  1. 添加了对 docker 容器的依赖
RUN apk update && apk upgrade \
   && apk add --no-cache ttf-dejavu

这对我有用!!! (但不是我的情况,因为我不想添加其他依赖项,这可能会导致在服务器上部署我的应用程序时出现更多问题)

  1. 切换到另一个 jdk(不是 alpine)有效,但也不是我的情况,因为我必须使用 alpine 版本

  2. 将 pdf 编码切换为

<pdfEncoding><![CDATA[Identity-H]]></pdfEncoding>
  1. 尝试添加 default.jasperreports.properties

net.sf.jasperreports.default.font.name=Tahoma
net.sf.jasperreports.default.pdf.font.name=Tahoma
net.sf.jasperreports.default.pdf.encoding=Cp1252
net.sf.jasperreports.default.pdf.embedded=false

这里我遇到了另一个 NPE 错误,用 Google 搜索了一下,只是找到了一个摆脱该默认属性的答案,没有人解决

那么如何处理 ALPINE JDK 中的这些错误呢?

【问题讨论】:

  • 我认为不安装一些字体包是没有办法的,比如ttf-dejavu或者freetype(建议的解决方案2)。正如您所提到的,Alpine vanilla 映像非常紧凑,并且包含绝对最少的所需软件包,其中不包括 GUI 支持和适当的字体。

标签: java docker jasper-reports alpine


【解决方案1】:

实际上,正如上面 Alex K 所说,不安装一些字体包是没有办法的。

当创建没有任何文本、任何表单、任何字体的空 Jasper 模板时,我最终弄明白了。并且出现了同样的问题。

我不得不从 Jasper 迁移到 iText 库,因为对我来说,由于 ci/cd 和部署设置,保留 jdk alpine 版本更重要

【讨论】:

  • 希望您在项目中使用时了解 itext 许可证,它是 AGPL 之一,在商业项目中使用时会出现一些问题
猜你喜欢
  • 2019-05-01
  • 1970-01-01
  • 2012-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-27
  • 1970-01-01
相关资源
最近更新 更多