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
3 Réponses :
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
Sur Ubuntu 18.0.4 LTS, la commande suivante a résolu le problème
sudo apt-get install fontconfig
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.
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.