问题
使用docker部署SpringBoot项目时,验证码代码恰好调用了JDK1.8底层的FontConfiguration这个类生成图片。
结果前端调用的时候抛了个异常。如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
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) ...... ..... |
解决
比较有效的解决办法是装ttf-dejavu
修改前Dockerfile:
1 2 3 4 |
FROM openjdk:8-jdk-alpine VOLUME /tmp ADD xx.jar app.jar ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"] |
追加一句话重新打包、编译、部署即可。
1 |
RUN apk add --update font-adobe-100dpi ttf-dejavu fontconfig |
修改后Dockerfile:
1 2 3 4 5 |
FROM openjdk:8-jdk-alpine VOLUME /tmp ADD xx.jar app.jar RUN apk add --update font-adobe-100dpi ttf-dejavu fontconfig ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"] |
原因
由于验证码需要的特殊字体在系统里是不存在的,不过sun的JDK是可以调用的,而openJDK不行,所以要么换JDK、要么安装字体库。