at sun.awt.FontConfiguration.getVersion(FontConfiguration.java:1264)报错问题解决

项目场景:

使用docker发布微服务时,因项目中有登录操作,需要图片验证码验证

问题描述:

由于在构建docker镜像时使用的是openjdk而不是oraclejdk,在生成图片验证码时出现了问题,后台报错

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)

原因分析:

根据报错信息是缺少某个字体,而docker打包镜像默认是没有该字体;或者因为使用了openjdk而没有使用oraclejdk,缺少依赖

解决方案:

只需要在项目的docker部署文件Dockerfile里添加一行代码(在生成镜像需要外网)
RUN apk add --update font-adobe-100dpi ttf-dejavu fontconfig

最终的Dockerfile文件为:

FROM classmethod/openjdk-alpine-git:latest
ADD xxx.jar app.jar
RUN sh -c 'touch /app.jar'
RUN apk add --update font-adobe-100dpi ttf-dejavu fontconfig
ENTRYPOINT [ "sh", "-c", "java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /app.jar" ]

或者在生成镜像时使用oraclejdk镜像

FROM classmethod/oraclejdk-alpine-git:latest
ADD xxx.jar app.jar
RUN sh -c 'touch /app.jar'
ENTRYPOINT [ "sh", "-c", "java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /app.jar" ]
                        原文链接:https://blog.csdn.net/qq_31263039/article/details/106545833
java.lang.NullPointerException: null
2020/5/29 上午8:40:11 at sun.awt.FontConfiguration.getVersion(FontConfiguration.java:1264)
2020/5/29 上午8:40:11 at sun.awt.FontConfiguration.readFontConfigFile(FontConfiguration.java:219)
                                    例如异常:NullPointerException at sun.awt.FontConfiguration.getVersion ,Could not initialize class sun.awt.X11FontManage。easyexcel默认是全部实体字段都会参与读写,不管你是否加了@ExcelProperty注解。最好不使用 lombok 的@Data、@Accessors注解。...
                                    docker中OpenJDK excel无法导出 java.lang.NullPointerException at sun.awt.FontConfiguration.getVersion
1.背景说明:
本地使用的是jdk1.8版本功能可正常使用,当通过docker打包镜像部署到linux环境下(openJDK1.8)后无法导出excel,报初始化是否,空指针异常,报错如下:
2.原因:
openjdk比jdk1.8简化了一些功能,所以用docker打包的时候更小。excel导出时初始化失败就是因为f
java.lang.NullPointerException: null
 at sun.awt.FontConfiguration.getVersion(FontConfiguration.java:1264)
 at sun.awt.FontConfiguration.readFontConfigFile(FontConfiguration.java:219)
 at sun.a...
                                    org.springframework.web.util.NestedServletException: Handler dispatch failed; nested exception is java.lang.InternalError: java.lang.reflect.InvocationTargetException
        at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServle.
本地测试完全没有问题,部署到线上,一直会报下面日志的错误信息。
                [nio-8080-exec-6] c.c.t.service.impl.TemplateServiceImpl   : >>>开始向【导出数据队列】投递消息<<<
2020...
Caused by: java.lang.NullPointerException
	at sun.awt.FontConfiguration.getVersion(FontConfiguration.java:1264)
	at sun.awt.FontConfiguration.readFontConfigFile(FontConfiguration.java:2
                                    我们有一个java应用程序,它使用第三方(asposee)生成word文档,但我认为这并不重要。应用程序是从一个简单的docker文件构建的:FROM openjdk:10-jdk-slimCOPY target/*.jar /opt/CMD $JAVA_HOME/bin/java $JAVA_OPTS -jar /opt/*.jar当我们在本地构建应用程序时(mvn package然后docke...
                                    验证码报错 java.desktop/sun.awt.FontConfiguration.getVersion(FontConfiguration.java:
服务器中缺少FontConfig,是因为服务器用的是OpenJDK, 所以需要手动安装。而本地用的则是正式JDK1.8,所以没有问题。
安装命令:yum install fontconfig
centOS版本:CentOS Linux release 7.5.1804 (Core)
问题java项目中使用到验证码,使用oracle版本jdk一切正常,更换openjdk后报如下异常:
java.lang.NullPointerException
    at sun.awt.FontConfiguration.getVersion(FontConfiguration.java:1264)
    at sun...