Docker启动Java项目报异常:FontConfiguration.getVersion(FontConfiguration.java:1264)
问题使用docker部署SpringBoot项目时,验证码代码恰好调用了JDK1.8底层的FontConfiguration这个类生成图片。结果前端调用的时候抛了个异常。如下123456789101112131415161718192021java.lang.NullPointerException: nullat sun.awt.FontConfiguration.getVersion(Font
·
问题
使用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、要么安装字体库。
更多推荐



所有评论(0)