Docker报错NullPointerException at sun.awt.FontConfiguration.getVersion解决

本文讲述了如何在Docker容器中遇到验证码生成错误后,通过离线方式安装FontConfig和ttf-dejavu字体,以解决OpenJDK导致的空指针异常,提供了解决步骤和关键操作细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题
使用Docker部署Jar包,登录的时候发现生成验证码失败,但是本地却没有问题。查看日志,报错:


java.lang.NullPointerException: null
    at sun.awt.FontConfiguration.getVersion(FontConfiguration.java:1264)
    at sun.awt.FontConfiguration.readFontConfigFile(FontConfiguration.java:219)
    at sun.awt.FontConfiguration.init(FontConfiguration.java:107)
    at sun.awt.X11FontManager.createFontConfiguration(X11FontManager.java:774)
    at sun.font.SunFontManager$2.run(SunFontManager.java:431)
    at java.security.AccessController.doPrivileged(Native Method)
    at sun.font.SunFontManager.<init>(SunFontManager.java:376)
    at sun.awt.FcFontManager.<init>(FcFontManager.java:35)
    at sun.awt.X11FontManager.<init>(X11FontManager.java:57)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
    at java.lang.Class.newInstance(Class.java:442)
    at sun.font.FontManagerFactory$1.run(FontManagerFactory.java:83)
    at java.security.AccessController.doPrivileged(Native Method)
    at sun.font.FontManagerFactory.getInstance(FontManagerFactory.java:74)
    at java.awt.Font.getFont2D(Font.java:491)
    at java.awt.Font.access$000(Font.java:224)
    at java.awt.Font$FontAccessImpl.getFont2D(Font.java:228)
    at sun.font.FontUtilities.getFont2D(FontUtilities.java:180)
    at sun.java2d.SunGraphics2D.checkFontInfo(SunGraphics2D.java:669)
    at sun.java2d.SunGraphics2D.getFontInfo(SunGraphics2D.java:830)
    at sun.java2d.pipe.GlyphListPipe.drawString(GlyphListPipe.java:50)
    at sun.java2d.SunGraphics2D.drawString(SunGraphics2D.java:2928)
    ………………
 

分析
这个问题网上答案已经非常多了——

OpenJDK比OracleJDK简化了一些功能,所以后端绘制验证码所要用到Java的AWT组件就被简化了,结果报出空指针。

问题出现了,现在有三种解决思路:

1、修改代码,后端只生成验证码内容,具体绘制交给前端
2、更换Docker镜像为 OracleJDK
3、基于操作系统安装FontConfig组件
综合比较快捷的是第三种方式:

1、在centos7系统安装FontConfig
yum install fontconfig

2、修改dockerfile ,添加一行,安装字体 ttf-dejavu
RUN apk add --update font-adobe-100dpi ttf-dejavu fontconfig

3、重启docker容器
docker restart 容器ID或容器名

但是由于博主的服务器是内网环境,所以没有办法,只能用离线安装的方式。


解决
1、离线安装 fontconfig
下载 fontconfig离线包:fontconfig-2.13.0-4.3.el7.x86_64.rpm

上传到服务器,执行命令:

rpm -ivh fontconfig-2.13.0-4.3.el7.x86_64.rpm  --nodeps --force
 


在 /usr/share 下多出 fontconfig 和 fonts 目录。

2、安装字体 ttf-dejavu
下载字体 ttf-dejavu : https://packages.msys2.org/package/mingw-w64-x86_64-ttf-dejavu (失效自行查找)

上传字体:将 字体文件打包上传到服务器 /usr/share/fonts 目录,解压

刷新字体:fc-cache --force , 刷新完成之后可以使用 fc-list 查看安装的字体


3、容器中安装字体
将上传的 ttf-dejavu 字体文件夹拷贝到容器/usr/share/fonts 目录中
docker cp -a TTF/  [容器id]:/usr/share/fonts

进入容器 ,刷新字体
# 进入容器
docker exec -it [容器id] bash
# 刷新字体
fc-cache --force

fc-list 就可以看到安装的 ttf-dejavu 字体


4、重启容器
最后重启容器:

docker restart [容器id]
 

OK,问题解决

### Java中关于`FontConfiguration.getVersion`导致的`NullPointerException`解决方案 在Java应用程序运行过程中,如果遇到由`FontConfiguration.getVersion`引发的`NullPointerException`,通常是因为某些依赖项未被正确初始化或者环境配置存在问题。以下是针对该问题的具体分析和解决办法: #### 1. **问题原因** `java.lang.NullPointerException`表明程序尝试访问某个对象实例的方法或属性时,该对象尚未被赋值或为空。具体到`FontConfiguration.getVersion`方法,在调用此方法之前可能缺少必要的字体资源加载过程[^1]。 #### 2. **排查步骤** 为了定位并解决问题,可以采取以下措施: - 确认当前环境中是否存在缺失的字体文件。可以通过检查操作系统的字体目录来验证是否有预期使用的字体支持。 - 如果是在特定平台上部署的应用(如Linux服务器),需确保安装了完整的图形库以及对应的TrueType字体包。例如,在Ubuntu上可通过命令 `sudo apt-get install fonts-liberation libfontconfig1` 安装必要组件。 #### 3. **代码调整建议** 对于开发人员而言,还可以通过捕获异常的方式增强健壮性。下面是一个简单的例子展示如何处理潜在的空指针风险: ```java try { String fontVersion = FontConfiguration.getVersion(); System.out.println("Font Configuration Version: " + fontVersion); } catch (NullPointerException e) { System.err.println("Error retrieving font configuration version."); // 可在此处记录日志以便后续调试 } ``` 上述代码片段展示了基本的错误捕捉机制,帮助开发者更早发现并应对可能出现的问题。 #### 4. **其他注意事项** 除了直接修复 NullPointerException 外,还应考虑优化整体架构设计以减少此类隐患的发生概率。比如引入更多单元测试覆盖边界条件下的行为表现;利用静态分析工具扫描源码寻找潜在缺陷等等[^2]。 --- ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值