背景
程序中涉及到了图形验证码,使用了自定义字体。 在本地以及测试环境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.