OpenJDK 比JDK缺少AWT组件部分功能
Apache POI 中使用SXSSFWorkbook出现Excel导出失败的异常。
问题堆栈
java
java.lang.NullPointerException: null
at sun.awt.FontConfiguration.getVersion(FontConfiguration.java:1264)
at sun.awt.FontConfiguration.readFontConfigFile(FontConfiguration.java:219)
at sun.awt.FontConfiguration.init(FontConfiguration.java:107)
at sun.awt.X11FontManager.createFontConfiguration(X11FontManager.java:774)
at sun.font.SunFontManager$2.run(SunFontManager.java:431)
at java.security.AccessController.doPrivileged(Native Method)
at sun.font.SunFontManager.<init>(SunFontManager.java:376)
at sun.awt.FcFontManager.<init>(FcFontManager.java:35)
at sun.awt.X11FontManager.<init>(X11FontManager.java:57)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at java.lang.Class.newInstance(Class.java:442)
at sun.font.FontManagerFactory$1.run(FontManagerFactory.java:83)
at java.security.AccessController.doPrivileged(Native Method)
at sun.font.FontManagerFactory.getInstance(FontManagerFactory.java:74)
at java.awt.Font.getFont2D(Font.java:491)
at java.awt.Font.canDisplayUpTo(Font.java:2060)
at java.awt.font.TextLayout.singleFont(TextLayout.java:470)
at java.awt.font.TextLayout.<init>(TextLayout.java:531)
at org.apache.poi.ss.util.SheetUtil.getDefaultCharWidth(SheetUtil.java:285)
at org.apache.poi.xssf.streaming.AutoSizeColumnTracker.<init>(AutoSizeColumnTracker.java:117)
at org.apache.poi.xssf.streaming.SXSSFSheet.<init>(SXSSFSheet.java:89)
at org.apache.poi.xssf.streaming.SXSSFWorkbook.createAndRegisterSXSSFSheet(SXSSFWorkbook.java:701)
at org.apache.poi.xssf.streaming.SXSSFWorkbook.createSheet(SXSSFWorkbook.java:722)
根本原因
服务器是使用的JDK是OpenJDK,AWT组件中被简化了,没有字体,同时服务器中没有字体包。而本地一般使用OracleJDK拥有完整的AWT功能。结果常出现本地服务功能正常,生产环境失败。
修复方案
方案一
直接将JDK更换成完整的版本,不用OpenJDK。
方案二
如果是使用Apache POI导出Excel失败,可以升级poi的jar版本,在5.2.3版本的时候对这个问题进行了修复。
https://poi.apache.org/changes.html#5.2.3
| Type | BUG | Module | Description |
|---|---|---|---|
![]() |
66230 | SXSSF | SXSSFWorkbook should work even when fonts not installed on OS |
方案三
给服务器(CentOS)安装配置字体
-
安装fontconfig
在线安装
shellyum install fontconfig离线方法,需要去下载对应的离线安装包,根据系统版本而定。举例:
shellrpm -ivh fontconfig-2.10.95-10.el7.x86_64.rpm --nodeps --force -
安装字体ttf-dejavu
在线安装
shellyum install ttf-dejavu离线方法,需要去下载对应的离线安装包,根据系统版本而定。举例:
下载地址:https://packages.msys2.org/packages/mingw-w64-x86_64-ttf-dejavu,取出其中的字体文件,重新打包

上传字体:将 字体文件打包上传到服务器,解压到
/usr/share/fonts目录刷新字体:执行命令
fc-cache --force查看安装的字体:执行命令
fc-list在上述的方案操作之后都是重启项目。
