记一次由oracle jdk 切换为open jdk引起的图形验证码报错
一.背景及报错原因分析
因为oracle jdk1.8之后要开始收费了,公司不得已转入使用openJDK。
环境的主要区别是生产使用的是OpenJDK,而之前应用都是基于OracleJDK 1.8来做的,图片验证码使用awt来画的,使用OracleJDK 1.8显示正常。但是更换成OpenJDK1.8后,验证码无法显示,后台代码抛出异常:
java.lang.NullPointerException at sun.awt.FontConfiguration.getVersion
查阅相关资料发现
相对于oracle JDK来讲openJDK缺少了部分组件支持,并且重写了一些实现。在openJDK中,是不包含任何字体的,在生成图形验证码等使用awt.font的需求时,需要额外的字体支持。也就是说以前的oracle jdk是自带字体类库 ,而现在切换了openjdk没有了字体的类库,需要自己在系统层面上去引入字体库。搜索相关资料后发现可以通过在centos上安装fontconfig插件来引入字体类库。
另外,OpenJDK于2021年7月15日宣布解散AWT, 2D, Swing,和Sound这几个项目,也就是说以后的jdk版本就没有桌面应用的功能了,相关API不在维护。
二. fontconfig插件安装
1.centos插件准备
fontconfig和ttmkfdir可以在centos官网搜索下载
https://centos.pkgs.org/7/centos-x86_64/fontconfig-2.13.0-4.3.el7.i686.rpm.html
https://centos.pkgs.org/7/centos-x86_64/ttmkfdir-3.0.9-42.el7.x86_64.rpm.html
字体包fonts可以在自己本地电脑找: C:\Windows\Fonts
将下载好的fontconfig插件和ttmkfdir插件以及字体上传到/home/fontconfig下
2.安装插件
# 进入安装目录
cd /home/fontconfig
# 安装fontconfig
rpm -ivh fontconfig-2.13.0-4.3.el7.x86_64.rpm --nodeps --force
# 安装ttmkfdir
rpm -ivh ttmkfdir-3.0.9-42.el7.x86_64.rpm --nodeps --force
# 执行ttmkfdir命令
ttmkfdir -e /usr/share/X11/fonts/encodings/encodings.dir
# 创建字体目录/usr/share/fonts/
mkdir -p /usr/share/fonts/chinese
# 移动字体文件到/usr/share/fonts/chinese
mv fonts /usr/share/fonts/chinese
# 添加文件夹权限
chmod -R 755 /usr/share/fonts/chinese/fonts
3.字体文件路径配置
vi /etc/fonts/fonts.conf
4.刷新内存中的字体缓存,并查看加入的字体
# 刷新缓存
fc-cache
# 查看字体
fc-list
三.拓展阅读
相对于oracle JDK来讲openJDK缺少了部分组件支持,并且重写了一些实现。在openJDK中,是不包含任何字体的,在生成图形验证码等使用awt.font的需求时,需要额外的字体支持。目前版本的openjdk还由awt相关的api,之后就不在维护了。
另外,2021年7月15日OpenJDK管理委员会全票通过批准成立由Phil Race担任初始负责人的 Client Libraries Group(客户端类库工作组)。新的工作组将继续赞助OpenJFX[1]和Lanai[2]两个项目。同时批准 AWT, 2D, Swing,和Sound这几个项目解散。另外Harfbuzz[3]、Framebuffer Toolkit[4] 和XRender Pipeline[5] 这几个项目因失去赞助而解散。 AWT, 2D, Swing这几个是我们熟知的Java桌面端解决方案。这次Java社区正式宣布项目解散,标志着Java正式不再为这几个项目提供技术迭代支持。Java桌面端仅存OpenJFX一个项目,而这个项目一直不温不火。可以说目前Java在桌面端的地位已经几乎丧失。
OpenJFX 项目
OpenJFX 是一个开源的下一代客户端应用程序平台,是 JavaFX 的开源项目。由 OpenJDK 开源社区领导。适用于与 JDK 一起使用的桌面和嵌入式系统。其目标是为开发富客户端应用程序开发一个现代、高效且功能齐全的工具包。
OpenJDK管理委员会
该管理委员会负责OpenJDK社区的架构和运作。它负责修订OpenJDK社区的章程以完善现有流程、定义新流程并处理不再需要的流程,类似一个立法机构。
由5名贡献者组成:
- 主席,由Oracle任命。
- 副主席,由IBM任命,
- OpenJDK Lead,由Oracle任命。
- 两名普通成员,由提名选举产生。