我知道有很多类似的问题,但我没有找到完全符合我的情况。
我有:
- Spring Boot应用程序
- 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错误,搜索了一下,发现了一种解决默认属性问题的答案,但没有一个可行的方法。
那么如何处理ALPINE JDK中的这些错误?