简体   繁体   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

i running on Linux my junit test with openJDK 11 and got following error:我在 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)

Not sure but it must have something to do with fonts in /usr/share/fonts.不确定,但它必须与 /usr/share/fonts 中的字体有关。 At the moment i have no fonts there.目前我那里没有字体。 I know that openJdk11 does not includes fonts anymore.我知道 openJdk11 不再包含字体。 But I'm not sure what to do.但我不知道该怎么做。

Thanks ...谢谢 ...

Just found a bug in an older version which is already fixed: https://bugs.java.com/bugdatabase/view_bug.do?bug_id=JDK-8144703刚刚在旧版本中发现了一个已经修复的错误: https : //bugs.java.com/bugdatabase/view_bug.do?bug_id=JDK-8144703

It seems OpenJDK 11 does not include some font-related stuff any more and your operating system is currently not providing any by itself.似乎 OpenJDK 11 不再包含一些与字体相关的内容,并且您的操作系统目前本身不提供任何内容。

You can try to install some font-related packages in your operating system to see if that solves the problem.您可以尝试在您的操作系统中安装一些与字体相关的软件包,看看是否可以解决问题。

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

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

sudo apt-get install fontconfig

I think you must have some fonts installed, otherwise you would get a NullPointerException before getting to this point.我认为您必须安装一些字体,否则在到达这一点之前您会得到 NullPointerException。

Does this simple program run okay,it would fail if no fonts installed ?这个简单的程序运行正常吗,如果没有安装字体会失败吗?

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

I think the issue is more that your fonts are not configured correctly , its kind of clear that getDefaultPhysicalFont() expect to get a font of type PhysicalFont but is actually getting one of type CompositeFont , not clear why that is happening.我认为问题更多是您的字体配置不正确,很明显 getDefaultPhysicalFont() 期望获得PhysicalFont类型的字体,但实际上获得的是CompositeFont类型的字体,不清楚为什么会发生这种情况。

Try running尝试跑步

fc-cache -rv *pathoffonts*

eg例如

fc-cache -rv /usr/share/fonts

that seemed worked for me when I add the same error also using Jakarta Poi, however Im not yet getting consistent results.当我也使用 Jakarta Poi 添加相同的错误时,这似乎对我有用,但是我还没有得到一致的结果。

In our case we had a service running on K8s which would throw this error on the first request but would run fine for subsequent requests.在我们的例子中,我们有一个在 K8s 上运行的服务,它会在第一个请求时抛出这个错误,但对于后续请求会正常运行。 Solved it by installing DejaVu in the base image of our Dockerfile, as some people recommended here .通过在我们的 Dockerfile 的基础镜像中安装 DejaVu 解决了这个问题, 正如一些人在这里推荐的那样

Something like就像是

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

Built the image, pushed it to Harbor and used the new image as a base image.构建镜像,将其推送到 Harbor 并将新镜像用作基础镜像。

暂无
暂无

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

相关问题 java:java.lang.ClassCastException:com.sun.proxy.$Proxy0 类无法转换为 com.sun.tools.javac.processing.JavacProcessingEnvironment 类 - java: java.lang.ClassCastException: class com.sun.proxy.$Proxy0 cannot be cast to class com.sun.tools.javac.processing.JavacProcessingEnvironment 线程“main”中的异常 java.lang.ClassCastException:类 com.sun.proxy.$Proxy0 不能转换为类船员 - Exception in thread “main” java.lang.ClassCastException: class com.sun.proxy.$Proxy0 cannot be cast to class crewcut java.lang.ClassCastException: class com.sun.org.apache.xerces.internal.dom.ElementNSImpl cannot be cast to class - java.lang.ClassCastException: class com.sun.org.apache.xerces.internal.dom.ElementNSImpl cannot be cast to class java.lang.NoClassDefFoundError:无法使用 OpenJDK 11.0 初始化 class sun.font.SunFontManager - java.lang.NoClassDefFoundError: Could not initialize class sun.font.SunFontManager with OpenJDK 11.0 java.lang.ClassCastException:com.sun.proxy。$ Proxy47无法转换为 - java.lang.ClassCastException: com.sun.proxy.$Proxy47 cannot be cast to RMI:java.lang.ClassCastException:com.sun.proxy。$ Proxy1无法转换为Funktion - RMI: java.lang.ClassCastException: com.sun.proxy.$Proxy1 cannot be cast to Funktion java.lang.ClassCastException:com.sun.proxy。$ Proxy1无法转换为 - java.lang.ClassCastException: com.sun.proxy.$Proxy1 cannot be cast to java.lang.ClassCastException(无法将类转换为同一类) - java.lang.ClassCastException (Cannot cast class to same class) java.lang.ClassCastException:CLASS/Activity 无法转换为 MainActivity - java.lang.ClassCastException: CLASS/Activity cannot be cast to MainActivity java.lang.ClassCastException:com.sun.media.sound.DirectAudioDevice$DirectClip 无法转换为 javax.sound.sampled.SourceDataLine - java.lang.ClassCastException: com.sun.media.sound.DirectAudioDevice$DirectClip cannot be cast to javax.sound.sampled.SourceDataLine
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM