无法在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$1(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$1.apply(App.scala:76) at scala.App$$anonfun$main$1.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$2.run(SunFontManager.java:431) at java.security.AccessController.doPrivileged(Native Method) at sun.font.SunFontManager.(SunFontManager.java:376) at sun.awt.X11FontManager.(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$1.run(FontManagerFactory.java:83) at java.security.AccessController.doPrivileged(Native Method) at sun.font.FontManagerFactory.getInstance(FontManagerFactory.java:74) at java.awt.Font.(Font.java:614) at java.awt.Font.createFont(Font.java:1056) at Main$.delayedEndpoint$Main$1(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$1.apply(App.scala:76) at scala.App$$anonfun$main$1.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)
因此,这不是inputstream的问题,而是在JRE 8中加载字体本身。
这似乎是JRE 8 Font中的一个错误。
我正在加载一个字体用于在图片中绘制字符串。 我的代码使用图像java:7-jre(ok),java:7-jdk(ok),java:8-jre(fail),java:8-jdk(ok)在Docker容器中运行。
事实certificate这是openjdk-8-jre-headless
安装的一个问题。 这是java 8 JRE的Docker镜像中的安装。 我只需安装openjdk-8-jre
(没有无头),问题就消失了。
如果你查看错误日志,加载字体需要awt X11,这是headless
JRE所缺少的。
我在openjdk中遇到了同样的错误:8-jre-alpine。 切换到openjdk:8-jre也有帮助。 (apt-get line似乎没必要)
--- FROM openjdk:8-jre-alpine +++ FROM openjdk:8-jre +++ RUN apt-get install -y libfontconfig
在CentOS无头JRE上缺少fontconfig
依赖:
yum install fontconfig
也可能需要安装至少一种字体( dejavu
, liberation
等)。
使用tomcat时我们也遇到了这个错误:8.0.38-jre8-alpine。 该图像缺少fontconfig。 您也可以安装ttf-dejavu
软件包,而不是切换到不同的图像。
apk add --update ttf-dejavu
对我来说这个问题解决了:
apt-get install -y libfontconfig1