CentOS服务器OpenJDK11 ClassCastException非安装包修复方案咨询
问题描述
在CentOS服务器上使用OpenJDK 11时,遇到如下ClassCastException异常:
java.lang.ClassCastException: class sun.font.CompositeFont cannot be cast to class sun.font.PhysicalFont (sun.font.CompositeFont and sun.font.PhysicalFont are in module java.desktop of loader 'bootstrap') java.desktop/sun.font.SunFontManager.getDefaultPhysicalFont(SunFontManager.java:1086) java.desktop/sun.font.SunFontManager.initialiseDeferredFont(SunFontManager.java:965) java.desktop/sun.font.SunFontManager.initialiseDeferredFonts(SunFontManager.java:831) java.desktop/sun.font.SunFontManager.loadFonts(SunFontManager.java:3182) java.desktop/sun.awt.X11FontManager.loadFonts(X11FontManager.java:438) java.desktop/sun.font.SunFontManager.getAllInstalledFonts(SunFontManager.java:3543) java.desktop/sun.java2d.SunGraphicsEnvironment.getAllFonts(SunGraphicsEnvironment.java:209) java.desktop/sun.java2d.HeadlessGraphicsEnvironment.getAllFonts(HeadlessGraphicsEnvironment.java:72)
已知安装fontconfig系统包可修复该问题,但希望找到无需安装任何包的修复方法,已尝试将fontconfig.properties文件复制到$JAVA_HOME/lib/目录,但未解决问题。
无需安装包的修复方法
以下是几种可行的无额外系统包方案:
1. 自定义字体配置并指定加载路径
之前复制fontconfig.properties无效,大概率是JDK未正确读取该文件。可手动编写正确配置并通过JVM参数强制加载:
- 创建自定义
fontconfig.properties文件,确保默认字体指向物理字体(而非CompositeFont),示例配置:default.font=SansSerif serif.0=DejaVu Serif serif.1=Times New Roman sansserif.0=DejaVu Sans sansserif.1=Arial monospaced.0=DejaVu Sans Mono monospaced.1=Courier New sun.font.path=/opt/custom-fonts - 将DejaVu系列等TTF物理字体文件放入上述配置的
/opt/custom-fonts目录(可自定义路径)。 - 启动Java应用时添加参数:
-Dsun.font.defaultFontConfigFile=/path/to/your/custom/fontconfig.properties
2. 直接指定JVM字体路径
无需配置文件,直接通过参数让JDK优先加载指定目录的物理字体:
- 准备一个存放TTF/OTF字体的目录(如
/opt/custom-fonts),放入物理字体文件。 - 启动应用时添加参数:
JDK会扫描该目录下的字体,优先使用这些物理字体作为默认,避免CompositeFont被误选。-Djava.awt.fonts=/opt/custom-fonts
3. 强制指定默认物理字体
通过JVM参数直接指定默认物理字体名称,前提是该字体已存在于服务器:
-Ddefault.font=DejaVu Sans
若服务器原本无该字体,可将对应TTF文件复制到$JAVA_HOME/lib/fonts目录,JDK会自动扫描识别。
内容的提问来源于stack exchange,提问作者peekaboo 5149
相关产品推荐
相关产品推荐

