异常如下
java.lang.NullPointerException
sun.awt.FontConfiguration.getVersion(FontConfiguration.java:1264)
sun.awt.FontConfiguration.readFontConfigFile(FontConfiguration.java:219)
sun.awt.FontConfiguration.init(FontConfiguration.java:107)
sun.awt.X11FontManager.createFontConfiguration(X11FontManager.java:774)
sun.font.SunFontManager$2.run(SunFontManager.java:441)
java.security.AccessController.doPrivileged(Native Method)
sun.font.SunFontManager.(SunFontManager.java:386)
sun.awt.FcFontManager.(FcFontManager.java:35)
sun.awt.X11FontManager.(X11FontManager.java:57)
sun.reflect.GeneratedConstructorAccessor513.newInstance(Unknown Source)
sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
java.lang.reflect.Constructor.newInstance(Constructor.java:423)
java.lang.Class.newInstance(Class.java:442)
sun.font.FontManagerFactory$1.run(FontManagerFactory.java:83)
java.security.AccessController.doPrivileged(Native Method)
sun.font.FontManagerFactory.getInstance(FontManagerFactory.java:74)
java.awt.Font.getFont2D(Font.java:491)
java.awt.Font.canDisplayUpTo(Font.java:2064)
java.awt.font.TextLayout.singleFont(TextLayout.java:470)
java.awt.font.TextLayout.(TextLayout.java:531)
问题原因
出现这个问题,一般是因为我们用 jdk 是精简过体积的 jdk 比如各种docker 镜像里面依赖的 jdk-slim,这里面为了减少jdk 包的体积会去掉这些内置字体资源,如果遇到你的应用又需要使用这些字体的情况,就会报错。
解决方案
只需要 os 上安装依赖下面两个依赖库即可,以 ubuntu 为例:
apt-get install -y ttf-dejavu fontconfig
扩展知识
ttf-dejavu 是开源的字体库, 通常和 fontconfig 配合使用
TTF-DejaVu
是一个开源的 TrueType 字体集合,它包含了多种语言的字符,特别是那些在其他字体中不常见的字符。DejaVu 字体项目旨在创建一个字体集合,它能够显示 Unicode 标准中的大部分字符,并且尽可能地保持字体的一致性。
Fontconfig
是一个用于配置和自定义字体的系统,它允许用户指定字体的优先级、替代字体以及字体的缓存等。Fontconfig 广泛用于 Unix-like 系统,包括 Linux 和 macOS。它通过一个配置文件(通常位于 /etc/fonts/fonts.conf
)来管理字体的设置,并且可以与多种桌面环境和应用程序集成,以提供一致的字体体验。
DejaVu 字体与 Fontconfig 结合使用,可以为用户提供一个更加丰富和灵活的字体选择,特别是在需要显示多种语言和特殊字符时。用户可以通过 Fontconfig 来设置 DejaVu 字体作为默认字体,或者在特定的应用程序中使用 DejaVu 字体来显示特定的字符集。