Java17升级JasperReports6.20.0后字体配置空指针等异常求助
Java 17 + JasperReports 6.20.0 报表运行异常解决指南
问题背景
将应用从Java 8升级至Java 17,同时同步升级JasperReports从6.0.3到6.20.0后,报表运行失败,抛出两类异常。此前已将字体导出为扩展Jar包,在Java 8 + JasperReports 6.0.3环境下运行正常。
环境信息
- OS:Red Hat Linux 7.9
- Tomcat:JWS 5.4(已配置
-Djava.awt.headless=true) - JDK:Oracle Java 17
抛出的异常信息
Caused by: java.lang.NullPointerException: Cannot load from short array because "sun.awt.FontConfiguration.head" is nullCould not initialize class net.sf.jasperreports.engine.util.JRStyledTextParser
已尝试但无效的方案
- 启用无头模式(已配置仍无效)
- 添加JasperReports 6.20.0的多数可选依赖Jar包
- 基于Java 17重新生成Jasper报表文件
- 从扩展Jar包提取字体添加至资源文件夹
针对性解决方案
1. 安装系统字体依赖库
Red Hat Linux 7.9下,Java 17的AWT字体配置依赖系统基础字体库,执行以下命令安装缺失组件:
yum install fontconfig dejavu-sans-fonts
安装完成后重启Tomcat,使系统字体配置生效。
2. 规范JasperReports字体扩展Jar包配置
确保字体扩展Jar包符合JasperReports 6.20.0的要求:
- 包内必须包含
jasperreports_extension.properties文件,示例配置:net.sf.jasperreports.extension.registry.factory.fonts=net.sf.jasperreports.engine.fonts.SimpleFontExtensionsRegistryFactory net.sf.jasperreports.extension.simple.font.families.customfonts=fonts/customfonts.xml - 字体定义XML文件(如
customfonts.xml)需正确声明字体族信息:<?xml version="1.0" encoding="UTF-8"?> <fontFamilies> <fontFamily name="CustomFont"> <normal>fonts/CustomFont-Regular.ttf</normal> <bold>fonts/CustomFont-Bold.ttf</bold> <pdfEncoding>Identity-H</pdfEncoding> <pdfEmbedded>true</pdfEmbedded> </fontFamily> </fontFamilies> - 将字体扩展Jar包放置在Tomcat的
WEB-INF/lib目录下,避免与其他字体配置冲突。
3. 调整JVM启动参数
在Tomcat启动参数中添加以下配置,强制指定字体加载路径:
-Dsun.awt.fontconfig=/etc/fonts/fonts.conf -Djava.awt.fonts=/usr/share/fonts/dejavu
若使用自定义字体目录,替换/usr/share/fonts/dejavu为你的字体目录路径。
4. 排查JRStyledTextParser初始化问题
该异常多为字体配置异常引发的连锁反应,解决字体问题后通常会自动消失。若仍存在:
- 清理
WEB-INF/lib下的旧版本JasperReports残留Jar包,避免依赖冲突。 - 补充JVM参数:
-Djava.awt.headless.lib=true,增强无头模式下的AWT环境兼容性。
内容的提问来源于stack exchange,提问作者Madhawa
相关产品推荐
相关产品推荐

