- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我有一台 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-list 未返回任何内容)
现在我的应用程序更进一步了,但仍然失败,报告
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 应用程序运行所需的最小字体集是什么。我不清楚我是否只需要提供字体或 fonts.properties 文件,或者该文件仅由 Oracle jres 而不是 OpenJdk 使用
我在使用 OpenJdk1.8 时遇到了同样的问题,但是从内存中简单地创建一个字体文件夹并将字体放入其中似乎可行,但现在这个 openjdk 9 版本不起作用。
我可以将字体复制到机器上,但我无法运行安装命令将字体直接安装到机器上。
更新
然后我复制了 Oracle jre 提供的 Lucida 字体并放入 jre/libs/font 并在该文件夹上运行 fc-cache -rv 现在它可以工作了,为什么 ipag.ttf 字体不够?
为什么我必须运行 fc-cache 而不是 java 只是通过在字体文件夹中找到它们来获取字体。
最佳答案
最近的 openjdk 和 java 版本使用 fontconfig,它可以在广泛的语言环境中选择合适的字体(或字体替换)(例如,当没有系统字体单独具有足够的覆盖范围时,从多种字体构建文本)。它比只涵盖一组有限的编码和语言环境的旧系统更完整和准确,只能做出简单的决定并需要在 fonts.properties 文件中手动声明字体替换顺序。基本上,旧系统无法扩展到世界上的语言环境数量和当今 unicode 的复杂性
但是要计算出正确的选择,fontconfig 需要首先对字体进行分析和索引。这就是 fc-cache 的意义所在。 Fontconfig 不能只按需读取字体文件,例如,Google Noto 字体家族仅重量为千兆字节,它需要预先计算一个索引,以便在有一段文本要呈现时帮助快速选择正确的文件。 Lucida 是一种具有玩具(按照当前标准)unicode 覆盖率的传统字体。
由于 fontconfig 的全部意义在于避免在最后一分钟读取大量复杂字体文件的巨大计算损失,因为它们至少存在于安装系统的人中,它至少依赖于生成其索引(缓存)有问题的时刻。例如,当您安装字体包时,RHEL/Centos 等 Linux 发行版会自动执行此操作。
我不记得你是否可以配置 fontconfig 来监视它的字体目录并在它们发生变化时自动生成新的缓存。这可能不是一个好主意,索引复杂的 opentype unicode 字体需要大量计算,并且众所周知,人们会在日志中移动文件,同时按顺序排列字体目录。
fontconfig 希望找到要索引的字体的实际目录取决于您的系统配置。
为什么 ipag.ttf 不够用?这取决于文件的内容。一个 ttf 文件可以包含数以万计的字形或仅包含一个对编写文本无用的虚荣符号。
关于java - 如何安装 Java 9 openjdk 应用程序所需的最小字体集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48811474/
首先我觉得奇怪的是 OpenJDK project page 上没有错误跟踪器的链接。 ,然后我找到了bugs.openjdk.java.net ,但仅适用于经过认证的项目成员。象牙塔之外的人如何贡献
关闭。这个问题需要更多focused .它目前不接受答案。 想改善这个问题吗?更新问题,使其仅关注一个问题 editing this post . 去年关闭。 Improve this questio
openjdk-7-jre-headless 和 openjdk-7-jre 有什么区别。 当我在 Ubuntu 的终端中输入 java 时,它提示 openjdk-7-jre-headless 而不
我无法理解 Java JRE 的一些基础知识。 我需要在嵌入式系统中运行 Java 代码,为此我需要在 Linux 内核中安装一个最小的 Java 运行时环境,也就是说,执行 Java 二进制文件所需
我正在使用 Redhat 6,我正在使用 java 1.6,因为我需要使用 java 1.6。我使用更新我的红帽yum update 和 openjdk 1.8 已自动安装。我尝试使用 删除 open
我在 Windows 上开发,在 Linux 上部署。我找不到windows和linux版本相同的OpenJdk。因此,我为 Windows 安装了 openjdk_1.7.0_u80-unoffic
Wildfly 13 和 Wildfly 14 支持哪些 OpenJDK 版本?有人可以向我提供支持矩阵吗? 最佳答案 我使用 WildFly 14 和 Open JDK 11 - 到目前为止没有任何
需要使用需要openjdk7的程序。运行 Debian 9 Mate。 当我尝试安装时获取以下内容 $sudo apt-get install openjdk-7-jre openjdk-7-jre-
我正在使用带有 heroku 插件的 IntelliJ 14,并且成功连接到 heroku。但是我无法对 heroku 进行更改。 我的应用程序使用 grails 2.5 和 Java 8。 似乎 h
在最近的许多情况下,但现在我尝试使用安装程序,它会抛出错误并显示“Java 未安装”之类的内容,即使 JAVA_HOME 设置为 Windows 10 64x 的 AdoptOpenJDK 安装程序安
我使用存储库 ppa:openjdk-r/ppa 在 ubuntu 14.04 LTS 上安装 openjdk-8-jre-headless。从今天早上开始一切正常,但现在安装因错误消息而中断 ope
这个问题在这里已经有了答案: Difference between openjdk-6-jre, openjdk-6-jre-headless, openjdk-6-jre-lib (2 个回答) 关
根据 https://github.com/docker-library/docs/blob/master/openjdk/README.md#make-jvm-respect-cpu-and-ram
我正在使用 IKVM 将 java 应用程序包装到 dll 中。我对 IKVM 不是特别熟悉,所以我提前为没有提供足够的信息表示歉意。无论如何,我正在使用一个 C# 库来调用 IKVM 创建的 dll
当我安装 netbeans 时,它让我可以选择 java 环境,我有 3 个选项,oracle java 和这两个(java-1.7.0-openjdk-i386 和 java-7-openjdk-i
使用brew和/或brew cask安装java 8和sbt显然是可能的,我遇到的问题是,brew 将 java 13 安装为 sbt 依赖项, 而且我不知道返回到默认 java 8 的一般方法,因为
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎不是关于 a specific programming problem, a softwar
我已经在 Ubuntu 机器上运行这个旧的 Caucho Resin (4.0.41) 很多年了。我需要停用该服务器,因此我尝试在新的 Ubuntu 18.04.4 服务器上设置树脂 4.0.64,经
我刚刚开始使用 Playframework (Java) 开发一个应用程序,我认为使用支持 Playframework 的 Heroku 测试它是个好主意。 在 Heroku 上 Playframew
我尝试安装支持 Java 11 的最新稳定 Jenkins 版本。因此,在安装 Java 11(JDK) 后,我收到 Jenkins 的错误,指出发现了不正确的 java 版本。 因此卸载了 Java
我是一名优秀的程序员,十分优秀!