在OpenJdk中,如何使用附加的字体路径属性设置字体dir

2022-09-04 04:35:03

我试图让我的应用程序使用OpenJdk安装中使用附加的字体路径属性中的特定位置的字体,但它对我不起作用。

../jre1.8.0_121+1/bin/java  -Dappendedfontpath=/usr/lib/fonts/  -jar lib/songkong-4.7.jar -m /mnt/disk1/share

报告未安装任何字体,但 /usr/lib/fonts 文件夹包含字体ipag.ttf

请注意:

  • OpenJdk没有预安装的字体,它依赖于系统上安装的字体
  • 这是一个嵌入式系统,报告服务器上没有安装任何字体,不返回任何内容fc-list
  • 如果我将字体复制到jre / lib / fonts文件夹中,它可以工作,但我不允许将任何内容复制到此文件夹中。
  • 我也不允许运行根命令,例如fc-cache -f

如果我可以通过指定包含字体的字体文件夹来使其正常工作,那么对我来说这将是一个有效的解决方案。


答案 1

您可以尝试设置环境变量来启动 JVM,以使其知道目录路径。对于您的情况,这可以由 来完成。我的答案是基于 archlinux wiki 的 Java Runtime Enviroment fonts 文章。JAVA_FONTSexport JAVA_FONTS=/usr/lib/fonts


编辑:
在未安装字体的VM中进行测试表明,设置JAVA_FONTS不起作用,我得出的结论是,通过您的设置,可能无法实现您的目标。
我使用以下程序在未安装字体的VM上重现错误:

import javax.swing.*;
public class example{

    public static void main(String[] tArgs){
        JFrame j = new JFrame();
        j.add(new JButton("Test"));
        j.setVisible(true);
        j.pack();
   }

}

这是我的Stacktrace:https://pastebin.com/fy3JDnkN
给定X11FontManager的来源,当字体管理器在行中构造时发生错误。for (int i=0; i<fontConfigFonts.length; i++) {

public String[] getDefaultPlatformFont() {
    if (defaultPlatformFont != null) {
        return defaultPlatformFont;
    }
    String[] info = new String[2];
    getFontConfigManager().initFontConfigFonts(false);
    FontConfigManager.FcCompFont[] fontConfigFonts =
        getFontConfigManager().getFontConfigFonts();
    for (int i=0; i<fontConfigFonts.length; i++) {
        if ("sans".equals(fontConfigFonts[i].fcFamily) &&
            0 == fontConfigFonts[i].style) {
            info[0] = fontConfigFonts[i].firstFont.familyName;
            info[1] = fontConfigFonts[i].firstFont.fontFile;
            break;
        }
    }
    /* Absolute last ditch attempt in the face of fontconfig problems.
     * If we didn't match, pick the first, or just make something
     * up so we don't NPE.
     */
    if (info[0] == null) {
        if (fontConfigFonts.length > 0 &&
            fontConfigFonts[0].firstFont.fontFile != null) {
            info[0] = fontConfigFonts[0].firstFont.familyName;
            info[1] = fontConfigFonts[0].firstFont.fontFile;
        } else {
            info[0] = "Dialog";
            info[1] = "/dialog.ttf";
        }
    }
    defaultPlatformFont = info;
    return defaultPlatformFont;
}

这使得无法手动添加字体,因为NullPointerException发生在我们访问字体管理器之前,这种行为接缝在几行之后的注释中不打算使用。

如果有另一个适用于Linux的FontManager在没有安装默认系统字体的情况下不会崩溃,那么仍然有可能实现您的目标,但我找不到这样的替代品。


答案 2

一种解决方案可能是将字体包装在自己的jar中,并尝试做这样的事情


推荐