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

如何安装Java 9 openjdk应用程序所需的最小字体集

尹雅健
2023-03-14

我有一台blackbox linux机器,它只有一种字体/usr/lib/fonts/ipag。ttf但它似乎没有正确安装,而且是一个定制的openjdk 9安装

openjdk安装没有任何字体,但我尝试创建一个字体目录并将此字体复制到其中,但没有效果。

当我运行我的非GUI应用程序时,它需要字体来创建一个带有jakarta-poi的excel电子表格,但是它失败了:

Caused by: java.lang.NullPointerException
    at java.desktop/sun.awt.FontConfiguration.getVersion(Unknown Source)
    at java.desktop/sun.awt.FontConfiguration.readFontConfigFile(Unknown Source)
    at java.desktop/sun.awt.FontConfiguration.init(Unknown Source)
    at java.desktop/sun.awt.X11FontManager.createFontConfiguration(Unknown Source)
    at java.desktop/sun.font.SunFontManager$2.run(Unknown Source)
    at java.base/java.security.AccessController.doPrivileged(Native Method)
    at java.desktop/sun.font.SunFontManager.<init>(Unknown Source)
    at java.desktop/sun.awt.FcFontManager.<init>(Unknown Source)
    at java.desktop/sun.awt.X11FontManager.<init>(Unknown Source)

然后我试着跑步

fc-cache -rv /usr/lib/fonts

报告已安装字体(尽管fc列表不返回任何内容)

现在我的应用程序更进一步了,但仍然失败,报告

Caused by: java.lang.NullPointerException
    at java.desktop/sun.awt.FcFontManager.getDefaultPlatformFont(Unknown Source)
    at java.desktop/sun.font.SunFontManager$2.run(Unknown Source)
    at java.base/java.security.AccessController.doPrivileged(Native Method)
    at java.desktop/sun.font.SunFontManager.<init>(Unknown Source)
    at java.desktop/sun.awt.FcFontManager.<init>(Unknown Source)
    at java.desktop/sun.awt.X11FontManager.<init>(Unknown Source)

那么我该如何解决这个问题呢?我不清楚Java应用程序工作所需的最小字体集是什么。我不清楚我只需要提供字体或一个字体。属性文件,或者该文件仅由Oracle JRE而不是OpenJdk使用

我对OpenJdk1也有同样的问题。然而,从内存中简单地创建一个字体文件夹并将字体放入其中似乎是可行的,但这在这个openjdk 9版本中现在不起作用。

我可以将字体复制到计算机上,但我无法运行安装命令将字体直接安装到计算机上。

使现代化

然后我复制了OracleJRE提供的Lucida字体,并将其放入jre/libs/font,然后在该文件夹上运行fc cache-rv,现在它可以工作了,为什么ipag不能工作呢。ttf字体足够吗?

为什么我必须运行fc缓存?java只是通过在字体文件夹中查找字体来提取字体。

共有1个答案

巫马星雨
2023-03-14

最近的openjdk和java版本使用fontconfig,它可以在广泛的区域设置中选择合适的字体(或字体替换)(例如,当没有系统字体具有足够的覆盖面时,从几种字体中构建文本)。它比旧系统更加完整和准确,旧系统只涵盖有限的编码和区域设置,只能做出简单的决定,并需要在fonts.properties文件中手动声明字体替换顺序。基本上,旧系统无法扩展到世界上的地区数量和今天Unicode的复杂性

但要计算正确的选择,fontconfig需要首先分析字体并编制索引。这就是fc缓存的意义所在。Fontconfig不能只按需读取字体文件,例如,Google Noto字体系列仅重千兆字节,它需要预先计算索引,以帮助在出现要渲染的文本时快速选择正确的文件。Lucida是一种旧式字体,具有toy(按当前标准)unicode覆盖范围。

由于fontconfig的全部目的是避免在最后一刻仅仅因为存在大量复杂字体文件而读取大量复杂字体文件所带来的巨大计算损失,因此它依赖于安装系统的人在最短的时间内生成其索引(缓存)。例如,在安装字体包时,RHEL/Centos等Linux发行版会自动执行此操作。

我不记得你是否可以配置fontconfig来监视它的字体目录,并在它们改变时自动生成新的缓存。这可能不是一个好主意,索引复杂的opentype Unicode字体是非常计算密集型的,人们已经知道在日志中移动文件,同时将他们的字体目录排序

fontconfig希望在其中找到要索引的字体的实际目录取决于系统的配置。

为什么ipag.ttf还不够?这取决于文件上的内容。一个ttf文件可以包含数以万计的字形,或者只是一个对编写文本无用的虚荣符号。

 类似资料:
  • 运行appium程序时出现异常。请询问是否需要额外的信息。 TLDR: 原始错误:重新安装时需要“应用”选项 log4j:WARN找不到记录器(org.apache.http.client.protocol.RequestAddCookies)的追加器。log4j:警告请正确初始化log4j系统。log4j:请参阅http://logging.apache.org/log4j/1.2/faq.ht

  • 我编写了一个程序,将其导出为“.jar”,并在开发人员台式电脑以外的计算机上运行它。问题是笔记本电脑上的整个JFrame都变小了,因此某些文本被替换为“...”因为组件太小,无法完全显示。现在出现了一个问题,是否有可能动态地改变我的文本大小,它总是完全显示? 编辑1:我的问题是,我首先必须得到我的文本被替换为“...”时的字体大小。

  • 问题内容: 我不是在寻找java-web- start,而是在寻找胖客户端应用程序安装工具包。我有一个独立的应用程序,其中包含几个文件(jar文件,数据文件等),并且需要执行一些非常标准的安装任务,例如向用户询问目标目录,让他们找到系统的某些部分- 选择一些按计算机或按用户配置的选项,并可能尝试检测它们的某些计算机设置。 我正在寻找类似于MSI或其他向导驱动的安装应用程序的东西。什么是Java的良

  • 我对飞舞和飞镖语言还不熟悉。在开发了一些示例应用程序后,我从教程中了解到,简单的Tab Layout应用程序在发布后需要7MB用于APK,安装后的应用程序大小为27MB。我的问题如下: APK大小和已安装APP大小有什么区别? 当开发一个应用程序时,无论是本机还是Flutter,我们应该记住APK大小不应该很大,或者安装后的应用程序大小不应该很大? 记住本机和Flutter的所有优点和缺点,开发A

  • 有没有人知道通过Google Play发布的设备拥有者应用程序在发生更新时的生产行为? 正如我们所知,安装一个设备拥有者应用程序需要一些动机,而且并不容易:重置为出厂默认,然后为设备提供NFC--第二个设备等等……所以,即使我们认为这一步已经完成,任何进一步的更新是否每次都需要如此多的痛苦? 出现此问题是因为在我的开发设备上,如果之前安装了设备所有者应用程序,我无法重新启动该应用程序的更改…除非我

  • 问题内容: 当我说“已安装的应用程序”时,基本上是指在[控制面板]-> [添加/删除程序]中可见的任何应用程序。 我更喜欢用Python来做,但是C或C ++也可以。 问题答案: 如果您是指控制面板的“添加\删除程序”中显示的已安装应用程序列表,则可以在注册表项中找到它: 有关注册表树结构的更多信息,请参见此处。 您需要在python中使用winreg API 来从注册表中读取值。