无法在 JRE 8 中加载字体
Cannot load font in JRE 8
我无法从 JRE 8 中的 S3 Inputstream 加载字体。如果系统安装了 JRE 7、JDK 7,甚至 JDK 8,我都没有问题。
val fontInputStream = s3Client.getObject(bucketName, objectKey).getObjectContent
val customFont = Font.createFont(Font.TRUETYPE_FONT, fontInputStream).deriveFont(Font.TRUETYPE_FONT, 20F)
我得到的错误是
Exception in thread "main" java.io.IOException: Problem reading font data.
at java.awt.Font.createFont0(Font.java:1000)
at java.awt.Font.createFont(Font.java:877)
at Main$.delayedEndpoint$Main(Main.scala:31)
at Main$delayedInit$body.apply(Main.scala:11)
at scala.Function0$class.apply$mcV$sp(Function0.scala:40)
at scala.runtime.AbstractFunction0.apply$mcV$sp(AbstractFunction0.scala:12)
at scala.App$$anonfun$main.apply(App.scala:76)
at scala.App$$anonfun$main.apply(App.scala:76)
at scala.collection.immutable.List.foreach(List.scala:381)
at scala.collection.generic.TraversableForwarder$class.foreach(TraversableForwarder.scala:35)
at scala.App$class.main(App.scala:76)
at Main$.main(Main.scala:11)
at Main.main(Main.scala)
我试图将输入流加载到临时文件,但没有帮助。我还尝试直接从本地文件加载字体,但在获取字体元数据时遇到了不同的错误。这是错误日志。
Exception in thread "main" java.lang.NullPointerException
at sun.awt.FontConfiguration.getVersion(FontConfiguration.java:1264)
at sun.awt.FontConfiguration.readFontConfigFile(FontConfiguration.java:219)
at sun.awt.FontConfiguration.init(FontConfiguration.java:107)
at sun.awt.X11FontManager.createFontConfiguration(X11FontManager.java:776)
at sun.font.SunFontManager.run(SunFontManager.java:431)
at java.security.AccessController.doPrivileged(Native Method)
at sun.font.SunFontManager.<init>(SunFontManager.java:376)
at sun.awt.X11FontManager.<init>(X11FontManager.java:57)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:422)
at java.lang.Class.newInstance(Class.java:442)
at sun.font.FontManagerFactory.run(FontManagerFactory.java:83)
at java.security.AccessController.doPrivileged(Native Method)
at sun.font.FontManagerFactory.getInstance(FontManagerFactory.java:74)
at java.awt.Font.<init>(Font.java:614)
at java.awt.Font.createFont(Font.java:1056)
at Main$.delayedEndpoint$Main(Main.scala:32)
at Main$delayedInit$body.apply(Main.scala:11)
at scala.Function0$class.apply$mcV$sp(Function0.scala:40)
at scala.runtime.AbstractFunction0.apply$mcV$sp(AbstractFunction0.scala:12)
at scala.App$$anonfun$main.apply(App.scala:76)
at scala.App$$anonfun$main.apply(App.scala:76)
at scala.collection.immutable.List.foreach(List.scala:381)
at scala.collection.generic.TraversableForwarder$class.foreach(TraversableForwarder.scala:35)
at scala.App$class.main(App.scala:76)
at Main$.main(Main.scala:11)
at Main.main(Main.scala)
因此,这不是输入流的问题,而是 JRE 8 中字体本身的加载问题。
这似乎是 JRE 8 字体中的错误。
我正在加载用于在图片中绘制字符串的字体。
我的代码是 Docker 容器中的 运行 使用图像 java:7-jre (ok), java:7-jdk (ok), java:8- jre(失败),java:8-jdk(成功)。
原来这是openjdk-8-jre-headless
安装的问题。这是 Docker 映像中 java 8 JRE 的安装。我只是安装 openjdk-8-jre
(没有无头),问题就消失了。
如果您查看错误日志,加载字体需要 awt X11,headless
版本的 JRE 中缺少它。
对我来说,这个已解决的问题:
apt-get install -y libfontconfig1
在 CentOS 上,headless JRE 缺少 fontconfig
依赖项:
yum install fontconfig
还可能需要安装至少一种字体(dejavu
、liberation
等)。
我在 openjdk:8-jre-alpine 上遇到了同样的错误。切换到 openjdk:8-jre 有帮助。
--- FROM openjdk:8-jre-alpine
+++ FROM openjdk:8-jre
我们在使用 tomcat:8.0.38-jre8-alpine 时也遇到了这个错误。该图像缺少字体配置。
除了切换到不同的图像,您还可以安装 ttf-dejavu
软件包。
apk add --update ttf-dejavu
对于高山和 openjdk:
使用 RUN apk --update add fontconfig ttf-dejavu
为我工作。
我花了几天时间忍受它,直到我看到这个 github 线程并让夜晚变得快乐。它实际上又在调用 GraphicsEnvironment
我无法从 JRE 8 中的 S3 Inputstream 加载字体。如果系统安装了 JRE 7、JDK 7,甚至 JDK 8,我都没有问题。
val fontInputStream = s3Client.getObject(bucketName, objectKey).getObjectContent
val customFont = Font.createFont(Font.TRUETYPE_FONT, fontInputStream).deriveFont(Font.TRUETYPE_FONT, 20F)
我得到的错误是
Exception in thread "main" java.io.IOException: Problem reading font data.
at java.awt.Font.createFont0(Font.java:1000)
at java.awt.Font.createFont(Font.java:877)
at Main$.delayedEndpoint$Main(Main.scala:31)
at Main$delayedInit$body.apply(Main.scala:11)
at scala.Function0$class.apply$mcV$sp(Function0.scala:40)
at scala.runtime.AbstractFunction0.apply$mcV$sp(AbstractFunction0.scala:12)
at scala.App$$anonfun$main.apply(App.scala:76)
at scala.App$$anonfun$main.apply(App.scala:76)
at scala.collection.immutable.List.foreach(List.scala:381)
at scala.collection.generic.TraversableForwarder$class.foreach(TraversableForwarder.scala:35)
at scala.App$class.main(App.scala:76)
at Main$.main(Main.scala:11)
at Main.main(Main.scala)
我试图将输入流加载到临时文件,但没有帮助。我还尝试直接从本地文件加载字体,但在获取字体元数据时遇到了不同的错误。这是错误日志。
Exception in thread "main" java.lang.NullPointerException
at sun.awt.FontConfiguration.getVersion(FontConfiguration.java:1264)
at sun.awt.FontConfiguration.readFontConfigFile(FontConfiguration.java:219)
at sun.awt.FontConfiguration.init(FontConfiguration.java:107)
at sun.awt.X11FontManager.createFontConfiguration(X11FontManager.java:776)
at sun.font.SunFontManager.run(SunFontManager.java:431)
at java.security.AccessController.doPrivileged(Native Method)
at sun.font.SunFontManager.<init>(SunFontManager.java:376)
at sun.awt.X11FontManager.<init>(X11FontManager.java:57)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:422)
at java.lang.Class.newInstance(Class.java:442)
at sun.font.FontManagerFactory.run(FontManagerFactory.java:83)
at java.security.AccessController.doPrivileged(Native Method)
at sun.font.FontManagerFactory.getInstance(FontManagerFactory.java:74)
at java.awt.Font.<init>(Font.java:614)
at java.awt.Font.createFont(Font.java:1056)
at Main$.delayedEndpoint$Main(Main.scala:32)
at Main$delayedInit$body.apply(Main.scala:11)
at scala.Function0$class.apply$mcV$sp(Function0.scala:40)
at scala.runtime.AbstractFunction0.apply$mcV$sp(AbstractFunction0.scala:12)
at scala.App$$anonfun$main.apply(App.scala:76)
at scala.App$$anonfun$main.apply(App.scala:76)
at scala.collection.immutable.List.foreach(List.scala:381)
at scala.collection.generic.TraversableForwarder$class.foreach(TraversableForwarder.scala:35)
at scala.App$class.main(App.scala:76)
at Main$.main(Main.scala:11)
at Main.main(Main.scala)
因此,这不是输入流的问题,而是 JRE 8 中字体本身的加载问题。
这似乎是 JRE 8 字体中的错误。
我正在加载用于在图片中绘制字符串的字体。 我的代码是 Docker 容器中的 运行 使用图像 java:7-jre (ok), java:7-jdk (ok), java:8- jre(失败),java:8-jdk(成功)。
原来这是openjdk-8-jre-headless
安装的问题。这是 Docker 映像中 java 8 JRE 的安装。我只是安装 openjdk-8-jre
(没有无头),问题就消失了。
如果您查看错误日志,加载字体需要 awt X11,headless
版本的 JRE 中缺少它。
对我来说,这个已解决的问题:
apt-get install -y libfontconfig1
在 CentOS 上,headless JRE 缺少 fontconfig
依赖项:
yum install fontconfig
还可能需要安装至少一种字体(dejavu
、liberation
等)。
我在 openjdk:8-jre-alpine 上遇到了同样的错误。切换到 openjdk:8-jre 有帮助。
--- FROM openjdk:8-jre-alpine
+++ FROM openjdk:8-jre
我们在使用 tomcat:8.0.38-jre8-alpine 时也遇到了这个错误。该图像缺少字体配置。
除了切换到不同的图像,您还可以安装 ttf-dejavu
软件包。
apk add --update ttf-dejavu
对于高山和 openjdk:
使用 RUN apk --update add fontconfig ttf-dejavu
为我工作。
我花了几天时间忍受它,直到我看到这个 github 线程并让夜晚变得快乐。它实际上又在调用 GraphicsEnvironment