问题

EasyExcel 导出 Excel 文档,在开发机可以正常导出。上了测服之后,导出报空指针。

截屏2022-08-20 18.11.22.png


首先怀疑自己,但是又看见是 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

就可以在镜像中安装字体库了

org.aspectj.weaver.reflect.ReflectionWorld$ReflectionWorldException
org.aspectj.weaver.reflect.ReflectionWorld$ReflectionWorldException
Error:(3, 29) java: 程序包org.junit.jupiter.api不存在
Error:(3, 29) java: 程序包org.junit.jupiter.api不存在
java.lang.ClassNotFoundException: org.apache.commons.fileupload.disk.DiskFileItemFactory
您好,我是码农飞哥,感谢您阅读本文!本文主要介绍文件上传报的错
Exception in thread “main“ java.awt.AWTError: Assistive Technology not found: org.GNOME.Accessibilit
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
java.lang.SecurityException: class “org.bouncycastle.asn1.DERObject“‘s signer information does not m
org.apache.poi.POIXMLException: java.lang.reflect.InvocationTargetException
org.apache.poi.POIXMLException: java.lang.reflect.InvocationTargetException
java导出excel:Could not initialize class sun.awt.X11GraphicsEnvironment
java导出excel:Could not initialize class sun.awt.X11GraphicsEnvironment
java.lang.UnsatisfiedLinkError:org.apache.hadoop.io.nativeio.NativeIO$Windows.access0(Ljava/lang/String;I)
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数据