最近一个项目是用 Rancher 统一部署 , 所有程序均在 Docker 环境下运行 . 其中 Java 底包用的 Alpine , 但是 Alpine 没有自带默认字体 , 造成了一些问题 , 现记录解决方案.

Issue

遇到的问题是在后台管理系统中导出 Excel 时报空指针 java.lang.NullPointerException at sun.awt.FontConfiguration.getVersion(FontConfiguration.java:1264)

循着调用栈追踪问题 ,发现问题出在 Excel 组件上. Excel 组件试图根据字体大小自动调整单元格宽度 , 当寻找 fontconfig 时找不到, 返回 null .

复制以上报错谷歌 , 可以看到很多 Issue , 可以发现是 Alpine环境缺少对应的包 , 此问题影响所有官方 Alpine 的Java环境.

解决方案

1.

在项目的 Dockerfile 中进行修改 , 增加以下内容

1
ENV LANG en_US.UTF-8RUN apk add --update ttf-dejavu fontconfig && rm -rf /var/cache/apk/*

通过添加 fontconfig 和一款字体 dejavu , 可以完美解决问题 . 缺点是每次打包都要安装 ttf-dejavu 比较慢 , 因此该方法不推荐 .

2.

最好的方法是直接使用打包好的镜像

1
FROM frolvlad/alpine-java:jdk8-slim

参考链接