如何为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
相关产品推荐
相关产品推荐

