centos7缺少字体
使用docker部署SpringBoot项目时,验证码代码恰好调用了JDK1.8底层的FontConfiguration这个类生成图片。
结果前端调用的时候抛了个异常。如下
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:
FROM openjdk:8-jdk-alpine
VOLUME /tmp
ADD xx.jar app.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
追加一句话重新打包、编译、部署即可。
RUN apk add --update font-adobe-100dpi ttf-dejavu fontconfig
修改后Dockerfile:
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、要么安装字体库。