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

如何为Java 9 OpenJDK应用安装所需最小字体集?Linux环境排障

解决OpenJDK 9 + Jakarta-Poi生成Excel字体缺失问题

我之前在处理自定义OpenJDK搭配POI生成Excel的场景时,也碰到过类似的字体缺失坑,结合你描述的情况,给你整理几个实用的排查和解决步骤:

1. 先搞清楚JVM到底在看哪些字体路径

自定义安装的OpenJDK有时候不会自动读取系统默认的字体目录,先跑个命令看看JVM的字体搜索路径:

java -XshowSettings:properties -version | grep java.awt.fonts

如果输出里没看到/usr/lib/fonts,那问题就出在这——JVM根本没去扫你那台机器上的ipag.ttf。

2. 给OpenJDK手动指定字体路径

有两种方式,选适合你的:

  • 临时方案(启动应用时指定):在运行你的非GUI应用时,加上这个JVM参数:
    -Djava.awt.fonts=/usr/lib/fonts
    
    要是以后加其他字体目录,用冒号分隔就行:-Djava.awt.fonts=/usr/lib/fonts:/new/font/path
  • 永久方案(修改JDK配置):找到你自定义OpenJDK安装目录下的lib/fontconfig.properties(JDK9一般在这个位置,要是找不到就搜fontconfig.properties.src),把里面的fontpath改成:
    fontpath=/usr/lib/fonts
    
    改完保存,重启应用就行。

3. 验证JVM真的识别到了字体

光看命令输出不够,写个小Java程序确认下:

import java.awt.Font;
import java.awt.GraphicsEnvironment;

public class CheckLoadedFonts {
    public static void main(String[] args) {
        GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
        for (Font font : ge.getAllFonts()) {
            System.out.println("Loaded font: " + font.getFontName());
        }
    }
}

编译运行:

javac CheckLoadedFonts.java
java CheckLoadedFonts

看看输出里有没有IPAGothic(这是ipag.ttf对应的字体名称,不是文件名),有的话说明JVM已经认到了。

4. 给Jakarta-Poi手动指定 fallback 字体

要是前面都弄了还是不行,直接在POI代码里硬指定字体,避免它因找不到默认字体崩溃:

import org.apache.poi.ss.usermodel.Font;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

public class PoiExcelGenerator {
    public static void main(String[] args) {
        try (XSSFWorkbook workbook = new XSSFWorkbook()) {
            // 创建字体并指定已识别的字体名
            Font font = workbook.createFont();
            font.setFontName("IPAGothic");
            font.setFontHeightInPoints((short) 12);
            
            // 把字体应用到单元格样式
            CellStyle style = workbook.createCellStyle();
            style.setFont(font);
            
            // 后续创建单元格时使用这个样式
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

这里要注意,字体名必须和JVM识别的完全一致,别写ipag.ttf,要写IPAGothic这种。

5. 刷新系统字体缓存试试

Linux系统有字体缓存机制,有时候字体放进去了但缓存没更新,系统还是认不到。跑个命令刷新:

fc-cache -fv

执行完后重启你的应用,说不定就好了。


内容的提问来源于stack exchange,提问作者Paul Taylor

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 08:33:02