问题
EasyExcel 导出 Excel 文档,在开发机可以正常导出。上了测服之后,导出报空指针。
首先怀疑自己,但是又看见是 awt 报的空指针,懵逼了。
赶紧去 GitHub 看看有没有碰到相同问题的人。找到了一位和我情况一样的兄弟。原文如下
相同的代码,不同的结果。java.lang.NullPointerException at sun.awt.FontConfiguration.getVersion() #157
原来是因为 JDK 里面缺少字体软件,所以报错。
开发机的 Docker 基础镜像是 FROM openjdk:8
,而测试环境的是FROM openjdk:8-jdk-alpine
,而 alpine 是不带字体库。
瞬间明白了,为什么上了测服会报错。
解决方案
在参考了官方文档解决方案之后,我又按自己的需求做了尝试。
1.换基础镜像
这个最简单,但是我们其他服务在生产/测服都是 openjdk:8-jdk-alpine
。单独换镜像会出问题。为了 awt 就让镜像大很多也不太划算。
2.使用内存导出
EasyExcel.write(fileName, DemoData.class) // 核心这个配置 开始内存处理模式 .inMemory(Boolean.TRUE) .sheet("模板") .doWrite(data());
加上 inMemory(Boolean.TRUE)
就可以开启内存处理模式。避开 awt 。
不过官方提示了,1W 数据以内可以考虑,大了很容易OOM。遂只能放弃。
3.构建镜像的时候安装字体库
最后是采用安装字体库的方式解决的,只要在 Dockerfile 中加上
RUN apk add ttf-dejavu
就可以在镜像中安装字体库了