背景

程序中涉及到了图形验证码,使用了自定义字体。 在本地以及测试环境linux都没有问题, 但是到了预发环境就开始报错:

java.io.IOException: Problem reading font data.
        at java.desktop/java.awt.Font.createFont0(Font.java:1183)
        at java.desktop/java.awt.Font.createFont(Font.java:1052)
        at com.wf.captcha.base.Captcha.setFont(Captcha.java:277)
        at com.wf.captcha.base.Captcha.setFont(Captcha.java:273)
        at com.xxxxx.platform.account.admin.captcha.CaptchaServiceComponent.generateFormulaCaptcha(CaptchaServiceComponent.java:80)
        at com.xxxxx.platform.account.admin.captcha.CaptchaServiceComponent.generateCaptcha(CaptchaServiceComponent.java:32)
        at com.xxxxx.platform.account.admin.controller.SsoController.captcha(SsoController.java:135)
        at com.xxxxx.platform.account.admin.controller.SsoController$$FastClassBySpringCGLIB$$a598e8f9.invoke(<generated>)

异常

单看前两行报错,异常发生在Font.java 1183行, 但是进入到源码里面看,这个异常时包装后的,不是原始异常, 进一步调试发现根源:

原始异常

java.lang.NullPointerException at sun.awt.FontConfiguration.getVersion(FontConfiguration.java 1264)

本地环境以及测试环境都是JDK8, 唯独预发环境是jdk11, 所以猜测是jdk版本问题。 最后查询资料得知,是服务器缺少FontConfig组件,安装上重启应用即可解决。

sudo yum install -y fontconfig

如果使用了docker环境,则还需要执行

fc-ache --force

Q.E.D.