docker openjdk部署拥有验证码的项目报NullPointerException

出错如下:

java.lang.NullPointerException: null
	at sun.awt.FontConfiguration.getVersion(FontConfiguration.java:1264) ~[na:1.8.0_111-internal]
	at sun.awt.FontConfiguration.readFontConfigFile(FontConfiguration.java:219) ~[na:1.8.0_111-internal]
	at sun.awt.FontConfiguration.init(FontConfiguration.java:107) ~[na:1.8.0_111-internal]
	at sun.awt.X11FontManager.createFontConfiguration(X11FontManager.java:774) ~[na:1.8.0_111-internal]
	at sun.font.SunFontManager$2.run(SunFontManager.java:431) ~[na:1.8.0_111-internal]
	at java.security.AccessController.doPrivileged(Native Method) ~[na:1.8.0_111-internal]
	at sun.font.SunFontManager.<init>(SunFontManager.java:376) ~[na:1.8.0_111-internal]

出错原因:
一般的openjdk由于awt包缺少了某些东西,导致的报错

解决措施:
1)创建一个Dockerfile文件放到/home/dockerfile文件夹下,

FROM java:8-jre-alpine
RUN echo -e "https://mirror.tuna.tsinghua.edu.cn/alpine/v3.4/main\n\
https://mirror.tuna.tsinghua.edu.cn/alpine/v3.4/community" > /etc/apk/repositories

RUN apk --update add curl bash ttf-dejavu && \
      rm -rf /var/cache/apk/*

2)然后到/home/dockerfile目录下执行

docker build -t docker.io/java-font:8-jre-alpine .
### 解决Docker环境中EasyExcel导出出现`NullPointerException` #### 报错信息 在Linux Docker日志中,当尝试使用EasyExcel进行文件导出时遇到了`NullPointerException`。此异常通常发生在Java应用程序试图访问未初始化的对象或变量的情况下[^2]。 #### 问题原因分析 该问题的根本原因是Docker容器内缺乏必要的字体支持库,这影响到了Apache POI(由EasyExcel依赖)创建文档的过程。具体来说,在某些情况下,如果工作簿设置了自定义字体样式,则会触发这个错误。而这些字体可能并不存在于精简版的操作系统镜像里,比如Alpine Linux版本的JRE/JDK,默认并不包含完整的TrueType Fonts集合[^1]。 #### 方案实施 ##### 修改Dockerfile配置 针对上述情况的一个有效方法是在构建应用镜像的过程中安装所需的字体包。对于基于Alpine的基础镜像而言,可以通过向Dockerfile添加以下指令来实现: ```dockerfile ENV LANG en_US.UTF-8 RUN apk add --no-cache msttcorefonts-installer fontconfig && \ update-ms-fonts && fc-cache -f ``` 这段脚本不仅增加了微软核心字体的支持,还更新了系统的字体缓存以确保新加入的资源能够被正确识别和加载[^4]。 另外一种方式则是切换至更全面的基础映像,例如采用官方发布的OpenJDK而非alpine变种,这类基础映像往往已经预装了一些常见的字体集,从而减少了额外配置的需求。 ##### 调整EasyExcel设置 考虑到内存溢出的风险以及特定场景下的性能考量,建议启用流式写入模式而不是默认的记忆体内处理模式。这样做的好处是可以显著降低程序运行期间占用的RAM空间,同时也规避了一部分潜在的空指针风险。调整后的代码片段如下所示: ```java // 使用try-with-resources语句自动关闭资源 try (OutputStream out = new FileOutputStream("output.xlsx")) { EasyExcel.write(out, DemoData.class) .registerWriteHandler(new HorizontalCellStyleStrategy()) .sheet("SheetName") .doWrite(dataList); } catch(IOException e){ log.error(e.getMessage(),e); } ``` 这里通过注册一个简单的单元格风格策略实例(`HorizontalCellStyleStrategy`)替代了之前直接指定`.inMemory(true)`的方式;同时利用`try-with-resources`语法简化了对外部资源管理逻辑的编写[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值