4
votes

OpenJDK 11 java.lang.ClassCastException: la classe sun.font.CompositeFont ne peut pas être convertie en classe sun.font.PhysicalFont

Je cours sous Linux mon test junit avec openJDK 11 et j'ai obtenu l'erreur suivante:

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)

Je ne sais pas mais cela doit avoir quelque chose à voir avec les polices dans / usr / share / fonts. Pour le moment, je n'ai pas de polices là-bas. Je sais qu'openJdk11 n'inclut plus les polices. Mais je ne sais pas quoi faire.

Merci ...

Je viens de trouver un bogue dans une ancienne version qui est déjà corrigé: https://bugs.java.com/bugdatabase/view_bug.do? bug_id = JDK-8144703


1 commentaires

Ajoutez votre code pour l'ensemble du test unitaire en question. Voir: stackoverflow.com/help/mcve Je suppose que vous avez peut-être utilisé des classes solaires internes dont il n'est pas garanti qu'elles communiqués. C'est aussi ce qui s'est passé avec les chargeurs de classe passant de jdk8 à jdk11, les classes de base internes et les classes d'implémentation ont changé et les personnes qui leur ont lancé ce type d'échecs ont eu ce type d'échecs.


3 Réponses :


2
votes

Il semble qu'OpenJDK 11 n'inclut plus certains éléments liés aux polices et que votre système d'exploitation n'en fournit actuellement aucun par lui-même.

Vous pouvez essayer d'installer des packages liés aux polices dans votre système d'exploitation pour voir si cela résout le problème.

Consultez également les notes de publication sur https://www.oracle.com/technetwork/java/javase/11-relnote-issues-5012449.html#JDK-8191522


0 commentaires

1
votes

Sur Ubuntu 18.0.4 LTS, la commande suivante a résolu le problème

sudo apt-get install fontconfig


0 commentaires

0
votes

Je pense que certaines polices doivent être installées, sinon vous obtiendrez une NullPointerException avant d'arriver à ce point.

Ce programme simple fonctionne-t-il correctement, il échouerait si aucune police n'est installée?

fc-cache -rv /usr/share/fonts

Je pense que le problème est plus que vos polices ne sont pas configurées correctement , c'est un peu clair que getDefaultPhysicalFont () s'attend à obtenir une police de type PhysicalFont strong > mais en reçoit une de type CompositeFont , on ne sait pas pourquoi cela se produit.

Essayez d'exécuter

fc-cache -rv *pathoffonts*

par exemple

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

cela m'a semblé fonctionner lorsque j'ajoute la même erreur en utilisant également Jakarta Poi, mais je n'obtiens pas encore de résultats cohérents.


0 commentaires