You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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),放入物理字体文件。
  • 启动应用时添加参数:
    -Djava.awt.fonts=/opt/custom-fonts
    
    JDK会扫描该目录下的字体,优先使用这些物理字体作为默认,避免CompositeFont被误选。

3. 强制指定默认物理字体

通过JVM参数直接指定默认物理字体名称,前提是该字体已存在于服务器:

-Ddefault.font=DejaVu Sans

若服务器原本无该字体,可将对应TTF文件复制到$JAVA_HOME/lib/fonts目录,JDK会自动扫描识别。

内容的提问来源于stack exchange,提问作者peekaboo 5149

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 18:01:06