【问题标题】:sun.awt.X11FontManager: java.lang.reflect.InvocationTargetException (Arch Linux)sun.awt.X11FontManager: java.lang.reflect.InvocationTargetException (Arch Linux)
【发布时间】:2020-04-20 18:54:27
【问题描述】:

我有一个在屏幕上写一些文本的信息亭程序。它在我的 Ubuntu 18 笔记本电脑和运行 Raspbian 的 Raspberry Pi 3b 上运行良好。为了最小化开销,我在仅运行 X.org (+ xterm) 的 Raspberry Pi 3b 上使用 Arch Linux 来启动我的程序。但它在没有任何可用信息的情况下失败:

java.io.IOException:读取字体数据时出现问题。
在 java.desktop/java.awt.Font.createFont0(Font.java:1177)
在 java.desktop/java.awt.Font.createFont(Font.java:1046)
在 code.Frame.(Frame.java:146)
在 code.Main.main(Main.java:58)

机器正在运行jre-openjdk 13,字体是从JAR加载的。

我已经尝试将java.io.tmpdir 更改为绝对可写的目录。我还把所有文件都小写了。

基本结构是:

  • 代码
    • 主要
    • 框架
  • 资源
    • roboto_bold.ttf

这是我的代码:

Font.createFont(Font.TRUETYPE_FONT, Main.class.getResourceAsStream("/resources/roboto_bold.ttf"))

知道问题是什么或如何调试吗?

更新:

我已经开始使用 IntelliJ 远程调试调用。这样我就可以创建一个堆栈跟踪:

java.lang.reflect.InvocationTargetException
在 java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
在 java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
在 java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
在 java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:500)
在 java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:481)
在 java.desktop/sun.font.FontManagerFactory$1.run(FontManagerFactory.java:84)
在 java.base/java.security.AccessController.doPrivileged(AccessController.java:312)
在 java.desktop/sun.font.FontManagerFactory.getInstance(FontManagerFactory.java:74)
在 java.desktop/java.awt.Font.createFont0(Font.java:1139)
在 java.desktop/java.awt.Font.createFont(Font.java:1046)
在 code.Frame.(Frame.java:146)
在 code.Main.main(Main.java:58)

我认为这意味着sun.awt.X11FontManager 不存在。我不知道如何解决这个问题。似乎是一个依赖问题,但 extra/fontconfig 2:2.13.91extra/freetype2 2.10.1 已安装。

【问题讨论】:

  • 似乎字体的位置是问题...

标签: java fonts dependencies awt archlinux-arm


【解决方案1】:

你需要这样的结构:

src:
   com.company
     Main.java
   resources
     roboto_bold.ttf

【讨论】:

  • 给定的结构位于src 目录中(可以更清楚地说明)。它在 Ubuntu 18 中运行。所以这似乎是一些平台相关的问题。
  • Ups,我错过了问题的那一部分。 Ubuntu 是否使用相同的 JRE?事实上,它是一个 java 应用程序,应该将平台问题抽象出来(希望如此)
  • 笔记本电脑使用的是 Java 11。是的,Java 确实增加了很多可移植性,但确实存在差距。我看到有人遇到这个问题,因为 Windows 上的路径不区分大小写,但在 Linux 上。
  • 你也能在 pi 上匹配 java 11 吗?
猜你喜欢
  • 2015-06-15
  • 2022-06-12
  • 2014-03-11
  • 2013-11-24
  • 2017-01-24
  • 2013-01-11
  • 2016-12-14
  • 1970-01-01
  • 2020-11-23
相关资源
最近更新 更多