繁体   English   中英

OpenJDK 11 java.lang.ClassCastException:类 sun.font.CompositeFont 不能转换为类 sun.font.PhysicalFont

[英]OpenJDK 11 java.lang.ClassCastException: class sun.font.CompositeFont cannot be cast to class sun.font.PhysicalFont

我在 Linux 上使用 openJDK 11 运行我的 junit 测试并出现以下错误:

java.lang.ClassCastException: class sun.font.CompositeFont cannot be cast to class sun.font.PhysicalFont (sun.font.CompositeFont and sun.font.PhysicalFont are in module java.desktop of loader 'bootstrap')
    at java.desktop/sun.font.SunFontManager.getDefaultPhysicalFont(SunFontManager.java:1086)
    at java.desktop/sun.font.SunFontManager.initialiseDeferredFont(SunFontManager.java:965)
    at java.desktop/sun.font.SunFontManager.findOtherDeferredFont(SunFontManager.java:903)
    at java.desktop/sun.font.SunFontManager.findDeferredFont(SunFontManager.java:919)
    at java.desktop/sun.font.SunFontManager.findFont2D(SunFontManager.java:2120)
    at java.desktop/java.awt.Font.getFont2D(Font.java:506)
    at java.desktop/java.awt.Font.canDisplayUpTo(Font.java:2246)
    at java.desktop/java.awt.font.TextLayout.singleFont(TextLayout.java:469)
    at java.desktop/java.awt.font.TextLayout.<init>(TextLayout.java:530)
    at org.apache.poi.ss.util.SheetUtil.getDefaultCharWidth(SheetUtil.java:275)
    at org.apache.poi.xssf.streaming.AutoSizeColumnTracker.<init>(AutoSizeColumnTracker.java:117)
    at org.apache.poi.xssf.streaming.SXSSFSheet.<init>(SXSSFSheet.java:82)
    at org.apache.poi.xssf.streaming.SXSSFWorkbook.createAndRegisterSXSSFSheet(SXSSFWorkbook.java:658)
    at org.apache.poi.xssf.streaming.SXSSFWorkbook.createSheet(SXSSFWorkbook.java:679)
    at com.textb2.ui.controller.ExcelCreator.newSheet(ExcelCreator.java:135)
    at com.textb2.ui.controller.ExcelCreator.buildExcel(ExcelCreator.java:182)
    at com.textb2.ui.controller.ExcelCreatorTest.testNoData(ExcelCreatorTest.java:91)
    at com.textb2.ui.controller.ExcelCreatorTest.testGermany(ExcelCreatorTest.java:53)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:566)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
    at org.apache.maven.surefire.junit4.JUnit4Provider.execute(JUnit4Provider.java:252)
    at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:141)
    at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:112)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:566)
    at org.apache.maven.surefire.util.ReflectionUtils.invokeMethodWithArray(ReflectionUtils.java:189)
    at org.apache.maven.surefire.booter.ProviderFactory$ProviderProxy.invoke(ProviderFactory.java:165)
    at org.apache.maven.surefire.booter.ProviderFactory.invokeProvider(ProviderFactory.java:85)
    at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:115)
    at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:75)

不确定,但它必须与 /usr/share/fonts 中的字体有关。 目前我那里没有字体。 我知道 openJdk11 不再包含字体。 但我不知道该怎么做。

谢谢 ...

刚刚在旧版本中发现了一个已经修复的错误: https : //bugs.java.com/bugdatabase/view_bug.do?bug_id=JDK-8144703

似乎 OpenJDK 11 不再包含一些与字体相关的内容,并且您的操作系统目前本身不提供任何内容。

您可以尝试在您的操作系统中安装一些与字体相关的软件包,看看是否可以解决问题。

另请参阅https://www.oracle.com/technetwork/java/javase/11-relnote-issues-5012449.html#JDK-8191522 上的发行说明

在 Ubuntu 18.0.4 LTS 上,以下命令修复了该问题

sudo apt-get install fontconfig

我认为您必须安装一些字体,否则在到达这一点之前您会得到 NullPointerException。

这个简单的程序运行正常吗,如果没有安装字体会失败吗?

import java.awt.*;
public class Fonts
{
     public static void main(String[] args) throws Exception
     {
         Font defaultFont = Font.decode(null);
         System.out.println(defaultFont);
     }
}

我认为问题更多是您的字体配置不正确,很明显 getDefaultPhysicalFont() 期望获得PhysicalFont类型的字体,但实际上获得的是CompositeFont类型的字体,不清楚为什么会发生这种情况。

尝试跑步

fc-cache -rv *pathoffonts*

例如

fc-cache -rv /usr/share/fonts

当我也使用 Jakarta Poi 添加相同的错误时,这似乎对我有用,但是我还没有得到一致的结果。

在我们的例子中,我们有一个在 K8s 上运行的服务,它会在第一个请求时抛出这个错误,但对于后续请求会正常运行。 通过在我们的 Dockerfile 的基础镜像中安装 DejaVu 解决了这个问题, 正如一些人在这里推荐的那样

就像是

FROM <my base image> AS EXPLODED
RUN apk add --update ttf-dejavu && rm -rf /var/cache/apk/*

构建镜像,将其推送到 Harbor 并将新镜像用作基础镜像。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM