问题
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 中加上
就可以在镜像中安装字体库了
Exception in thread “main“ java.awt.AWTError: Assistive Technology not found: org.GNOME.Accessibilit
java.lang.SecurityException: class “org.bouncycastle.asn1.DERObject“‘s signer information does not m
org.apache.poi.POIXMLException: java.lang.reflect.InvocationTargetException
java.lang.UnsatisfiedLinkError:org.apache.hadoop.io.nativeio.NativeIO$Windows.access0(Ljava/lang/String;I)
java.util.NoSuchElementException: No mapping for class sun.awt.AppContext
学习java.util.NoSuchElementException: No mapping for class sun.awt.AppContext。
Java:org.apache.commons.collections4.MapUtils获取Map数据
Java:org.apache.commons.collections4.MapUtils获取Map数据