我正在使用定制的Java 11运行环境在自定义的Linux硬件上,这个Java运行时不是我构建的。但我的应用程序需要访问字体,而运行时没有配置任何字体,因此我会得到以下堆栈跟踪:
我可以提供一些字体,我已经确定需要创建一个 fontconfig.properties 文件并将其放入 Java 运行时的 lib 文件夹中,但我难以理解在 fontconfig.properties 中应该放置什么内容。
有人能否给我一个示例,在 Linux 上如何指定一个最小的字体集合,以防止出现异常。
更具体地说,我有一组 TrueType 字体,我将它们放入了 lib 文件夹中的一个 fonts 文件夹中,那么我该如何将此集合用作 Java 可用的字体集合。
Exception in thread "main" java.lang.InternalError: java.lang.reflect.InvocationTargetException
at java.desktop/sun.font.FontManagerFactory$1.run(FontManagerFactory.java:86)
at java.base/java.security.AccessController.doPrivileged(Native Method)
at java.desktop/sun.font.FontManagerFactory.getInstance(FontManagerFactory.java:74)
at java.desktop/java.awt.Font.getFont2D(Font.java:497)
at java.desktop/java.awt.Font.getFamily(Font.java:1410)
at java.desktop/java.awt.Font.getFamily_NoClientCode(Font.java:1384)
at java.desktop/java.awt.Font.getFamily(Font.java:1376)
at java.desktop/java.awt.Font.toString(Font.java:1869)
at java.base/java.lang.String.valueOf(String.java:2951)
at java.base/java.io.PrintStream.println(PrintStream.java:897)
at Fonts.main(Fonts.java:7)
Caused by: java.lang.reflect.InvocationTargetException
at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:490)
at java.desktop/sun.font.FontManagerFactory$1.run(FontManagerFactory.java:84)
... 10 more
Caused by: java.lang.NullPointerException
at java.desktop/sun.awt.FontConfiguration.getVersion(FontConfiguration.java:1262)
at java.desktop/sun.awt.FontConfiguration.readFontConfigFile(FontConfiguration.java:225)
at java.desktop/sun.awt.FontConfiguration.init(FontConfiguration.java:107)
at java.desktop/sun.awt.X11FontManager.createFontConfiguration(X11FontManager.java:719)
at java.desktop/sun.font.SunFontManager$2.run(SunFontManager.java:367)
at java.base/java.security.AccessController.doPrivileged(Native Method)
at java.desktop/sun.font.SunFontManager.<init>(SunFontManager.java:312)
at java.desktop/sun.awt.FcFontManager.<init>(FcFontManager.java:35)
at java.desktop/sun.awt.X11FontManager.<init>(X11FontManager.java:56)
我可以提供一些字体,我已经确定需要创建一个 fontconfig.properties 文件并将其放入 Java 运行时的 lib 文件夹中,但我难以理解在 fontconfig.properties 中应该放置什么内容。
有人能否给我一个示例,在 Linux 上如何指定一个最小的字体集合,以防止出现异常。
更具体地说,我有一组 TrueType 字体,我将它们放入了 lib 文件夹中的一个 fonts 文件夹中,那么我该如何将此集合用作 Java 可用的字体集合。
- LucidaBrightDemiItalic.ttf
- LucidaBrightRegular.ttf
- LucidaSansRegular.ttf
- LucidaTypewriterRegular.ttf
- LucidaBrightDemiBold.ttf
- LucidaBrightItalic.ttf
- LucidaSansDemiBold.ttf
- LucidaTypewriterBold.ttf
Caused by: java.lang.NullPointerException
at java.desktop/sun.awt.FontConfiguration.getInitELC(FontConfiguration.java:465)
at java.desktop/sun.awt.FontConfiguration.initFontConfig(FontConfiguration.java:441)
at java.desktop/sun.awt.FontConfiguration.init(FontConfiguration.java:108)
at java.desktop/sun.awt.X11FontManager.createFontConfiguration(X11FontManager.java:719)
at java.desktop/sun.font.SunFontManager$2.run(SunFontManager.java:367)
at java.base/java.security.AccessController.doPrivileged(Native Method)
at java.desktop/sun.font.SunFontManager.<init>(SunFontManager.java:312)
at java.desktop/sun.awt.FcFontManager.<init>(FcFontManager.java:35)
at java.desktop/sun.awt.X11FontManager.<init>(X11FontManager.java:56)
这表明Java运行时至少找到了(空的)fontconfig.properties文件,因此如果我可以正确配置它,这应该可以工作。
我尝试创建一个非常简单的fontconfig.properties文件,只有一个文件,但它没有起作用。
version=1
allfonts.plain.latin-1=-monotype-times new roman-medium-r-normal--*-%d-*-*-p-*-iso10646-1
filename.-monotype-times new roman-medium-r-normal--*-%d-*-*-p-*-iso10646-1=/mnt/app/opt/SongKong/songkong/jre/lib/fonts/ipag.ttf
awtfontpath.latin-1=/mnt/app/opt/SongKong/songkong/jre/lib/fonts