当前位置: 首页 > 知识库问答 >
问题:

在OpenJdk中,如何使用appendedfontpath属性设置字体目录

秦天宇
2023-03-14

我试图让我的应用程序使用OpenJdk安装中使用appendedfontpath属性的特定位置的字体,但它不适用于我。

../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

如果我能通过指定一个包含字体的字体文件夹来让它工作,这对我来说将是一个工作解决方案。

共有3个答案

上官凯歌
2023-03-14

您不需要指定字体目录。如果它安装在您的计算机中,JRE将自动选择字体。

我过去也面临过这个问题,发现了一个预构建的开放JRE包,其中包含github中的字体。这些包是在GNU GPL v.2下发布的,只有类路径例外。

https://github.com/ojdkbuild/ojdkbuild/releases/tag/1.8.0.121-1

您可以下载Linux版本(java-1.8.0-openjdk-1.8.0.121-0.b13.el6_8。x86_64.zip),或者您可以在版本下查找121以外的更新。

注意:如果需要,还可以在jre/lib/fonts下包含缺少的True Type字体。

备选方案一

计算机中安装所需的字体。这将无缝地工作,您不必在JRE中配置任何东西。

注:

  • 如果您没有安装字体的权限,可以很好地复制fonts/usr/share/fonts目录

备选方案二

包括jre/lib/fonts目录中的字体(如果不存在,创建字体目录),并在jre/lib中配置fontconfig.properties文件。我还没有测试这个选项,但它应该工作。

编辑:

>

  • 如果字体已经安装在机器中,JVM应该自动选择字体。否则,您可以使用环境变量指定@BDouleB97答案中提到JAVA_FONTS字体。
  • 如果您没有设置环境变量的权限,您可以在运行时传递环境变量,如下所示。

    . java-DJAVA_FONTS=/usr/share/fonts Test

  • 丁毅庵
    2023-03-14

    一种解决方案可能是将字体打包到自己的jar中,并尝试这样做。

    周楷
    2023-03-14

    在启动JVM之前,您可以尝试设置JAVA\u fontenvironment变量,使其知道目录路径。对于您的情况,这可以通过导出JAVA_字体=/usr/lib/FONTS来完成。我的答案基于ArchLinuxWiki的Java运行时环境字体文章。

    编辑:
    在未安装字体的虚拟机中进行测试表明设置JAVA_字体不起作用,我得出结论,使用您的设置可能无法实现您的目标
    我使用以下程序在未安装字体的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)的行中构造时,会发生错误

    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发生在我们访问字体管理器之前,这一行为可能不会在几行之后给出注释。

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

     类似资料:
    • 问题内容: 如何在hibernate字段中设置默认值? 问题答案: 如果要使用真实的数据库默认值,请使用: 注意,其中的字符串是数据库相关的。同样,如果选择此选项,则必须使用,因此不包括在插入时带有值的列。否则谈论默认是无关紧要的。 但是,如果您不希望数据库默认值,而只是Java代码中的默认值,只需像这样初始化变量-

    • 问题内容: 这段代码返回一个错误:AttributeError:无法设置属性这真的很遗憾,因为我想使用属性而不是调用方法。有谁知道为什么这个简单的例子不起作用? 问题答案: 这是你想要的吗? 取自http://docs.python.org/library/functions.html#property。

    • 我有一个多模块Spring引导梯度项目。我在每个模块yml文件中都有指向数据库的属性:user、pass、URL。 这是一个可行的解决方案,但很难改变项目数据库。每次我想切换数据库用户或url,我必须改变10+yml文件。 如何避免这一点?

    • 了解在 Dreamweaver 中如何使用文本属性检查器应用 HTML 格式或 CSS 格式。 可以使用文本属性检查器应用 HTML 格式或层叠样式表 (CSS) 格式。应用 HTML 格式时,Dreamweaver 会将属性添加到页面正文的 HTML 代码中。应用 CSS 格式时,Dreamweaver 会将属性写入文档头或单独的样式表中。 注意:在创建 CSS 内联样式时,Dreamweave

    • 我想根据“配置文件”设置注释的值。 让我举个例子来解释; 在上面的例子中,我们可以看到活动的“配置文件”是PROD,但是假设我们想要使用DEV配置文件,我们将不得不注释来自PROD的@Table注释,并取消注释DEV@Table注释。 如果这只针对一个实体,那不会是一个问题,但我有很多实体都有这种情况,所以我不认为这是处理这种即兴“简介”的方式。 你知道有什么办法可以解决这种情况吗?

    • 目前正在练习使用android studio制作应用程序。我有这个自定义字体,并保存到res/font目录中供以后使用。在活动中,我试图使用typeface对象调用getfont(R.font.my\u customized\u font)。例如)Typeface font=getResources()。getfont(R.font.mycustomizedfont) 但是,当我尝试使用API级别