Docker使用OpenJDK镜像导致验证码错误:java

at sun.font.SunFontManager$2.run(SunFontManager.java:431)

at java.security.AccessController.doPrivileged(Native Method)

at sun.font.SunFontManager.(SunFontManager.java:376)

at sun.awt.FcFontManager.(FcFontManager.java:35)

at sun.awt.X11FontManager.(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)

at java.awt.Font.getFont2D(Font.java:491)

at java.awt.Font.access$000(Font.java:224)

at java.awt.Font$FontAccessImpl.getFont2D(Font.java:228)

at sun.font.FontUtilities.getFont2D(FontUtilities.java:180)

at sun.java2d.SunGraphics2D.checkFontInfo(SunGraphics2D.java:669)

at sun.java2d.SunGraphics2D.getFontInfo(SunGraphics2D.java:830)

at sun.java2d.pipe.GlyphListPipe.drawString(GlyphListPipe.java:50)

at sun.java2d.SunGraphics2D.drawString(SunGraphics2D.java:2928)

………………

分析

==============================================================

这个问题网上答案已经非常多了——

OpenJDK比OracleJDK简化了一些功能,所以后端绘制验证码所要用到Java的AWT组件就被简化了,结果报出空指针。

问题出现了,现在有三种解决思路:

  • 1、修改代码,后端只生成验证码内容,具体绘制交给前端

  • 2、更换Docker镜像为 OracleJDK

  • 3、基于操作系统安装FontConfig组件

综合比较快捷的是第三种方式:

  • 1、在centos7系统安装FontConfig

yum install fontconfig

  • 2、修改dockerfile ,添加一行,安装字体 ttf-dejavu

RUN apk add --update font-adobe-100dpi ttf-dejavu fontconfig

  • 3、重启docker容器

docker restart 容器ID或容器名

但是由于博主的服务器是内网环境,所以没有办法,只能用离线安装的方式。

解决

==============================================================

1、离线安装 fontconfig


  • 下载 fontconfig离线包:fontconfig-2.13.0-4.3.el7.x86_64.rpm

  • 上传到服务器,执行命令:

rpm -ivh fontconfig-2.13.0-4.3.el7.x86_64.rpm --nodeps --force

在这里插入图片描述

/usr/share 下多出 fontconfigfonts 目录。

2、安装字体 ttf-dejavu


  • 下载字体 ttf-dejavu : https://packages.msys2.org/package/mingw-w64-x86_64-ttf-dejavu (失效自行查找)

  • 上传字体:将 字体文件打包上传到服务器 /usr/share/fonts 目录,解压

在这里插入图片描述

  • 刷新字体:fc-cache --force , 刷新完成之后可以使用 fc-list 查看安装的字体

在这里插入图片描述

3、容器中安装字体


  • 将上传的 ttf-dejavu 字体文件夹拷贝到容器/usr/share/fonts 目录中

docker cp -a TTF/ [容器id]:/usr/share/fonts

  • 进入容器 ,刷新字体
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值