【发布时间】:2021-08-24 21:09:26
【问题描述】:
我知道有很多类似的问题,但我没有找到确切的情况
我有:
- Spring 启动应用程序
- 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>
- 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
- 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>
- 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
我尝试了一些解决方案
- 将 JAVA_OPT 添加到 docker 容器中
-Djava.awt.headless=true
- 添加了对 docker 容器的依赖
RUN apk update && apk upgrade \
&& apk add --no-cache ttf-dejavu
这对我有用!!! (但不是我的情况,因为我不想添加其他依赖项,这可能会导致在服务器上部署我的应用程序时出现更多问题)
-
切换到另一个 jdk(不是 alpine)有效,但也不是我的情况,因为我必须使用 alpine 版本
-
将 pdf 编码切换为
<pdfEncoding><![CDATA[Identity-H]]></pdfEncoding>
- 尝试添加 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