Application JDK 7 / JavaFX 2 sur Mac OSX El Capitan

Je viens de mettre à niveau vers El Capitan et je rencontre des problèmes pour démarrer une application JavaFX2 personnalisée exécutée sous JDK1.7.0u79 (la dernière version disponible d’Oracle).

Au démarrage de l’application, j’obtiens cette exception:

Exception in thread "main" java.lang.RuntimeException: Exception in Application start method at com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:403) at com.sun.javafx.application.LauncherImpl.access$000(LauncherImpl.java:47) at com.sun.javafx.application.LauncherImpl$1.run(LauncherImpl.java:115) at java.lang.Thread.run(Thread.java:745) Caused by: java.lang.ExceptionInInitializerError at java.lang.Class.forName0(Native Method) at java.lang.Class.forName(Class.java:191) at javafx.scene.control.Control.loadClass(Control.java:115) at javafx.scene.control.Control.loadSkinClass(Control.java:1021) at javafx.scene.control.Control.access$500(Control.java:70) at javafx.scene.control.Control$12.invalidated(Control.java:972) at javafx.beans.property.SsortingngPropertyBase.markInvalid(SsortingngPropertyBase.java:127) at javafx.beans.property.SsortingngPropertyBase.set(SsortingngPropertyBase.java:161) at com.sun.javafx.css.StyleableSsortingngProperty.set(StyleableSsortingngProperty.java:71) at javafx.scene.control.Control$12.set(Control.java:964) at com.sun.javafx.css.StyleableSsortingngProperty.applyStyle(StyleableSsortingngProperty.java:59) at com.sun.javafx.css.StyleableSsortingngProperty.applyStyle(StyleableSsortingngProperty.java:31) at com.sun.javafx.css.StyleableProperty.set(StyleableProperty.java:70) at com.sun.javafx.css.StyleHelper.transitionToState(StyleHelper.java:900) at javafx.scene.Node.impl_processCSS(Node.java:7418) at javafx.scene.Parent.impl_processCSS(Parent.java:1146) at javafx.scene.control.Control.impl_processCSS(Control.java:1154) at javafx.scene.Parent.impl_processCSS(Parent.java:1153) at javafx.scene.Parent.impl_processCSS(Parent.java:1153) at javafx.scene.Node.processCSS(Node.java:7386) at javafx.scene.Scene.doCSSPass(Scene.java:454) at javafx.scene.Scene.preferredSize(Scene.java:1468) at javafx.scene.Scene.impl_preferredSize(Scene.java:1535) at javafx.stage.Window$9.invalidated(Window.java:717) at javafx.beans.property.BooleanPropertyBase.markInvalid(BooleanPropertyBase.java:127) at javafx.beans.property.BooleanPropertyBase.set(BooleanPropertyBase.java:161) at javafx.stage.Window.setShowing(Window.java:781) at javafx.stage.Window.show(Window.java:796) at javafx.stage.Stage.show(Stage.java:233) at au.com.religaresecurities.trademax.client.Start.start(Start.java:131) at com.sun.javafx.application.LauncherImpl$5.run(LauncherImpl.java:319) at com.sun.javafx.application.PlatformImpl$5.run(PlatformImpl.java:219) at com.sun.javafx.application.PlatformImpl$4$1.run(PlatformImpl.java:182) at com.sun.javafx.application.PlatformImpl$4$1.run(PlatformImpl.java:179) at java.security.AccessController.doPrivileged(Native Method) at com.sun.javafx.application.PlatformImpl$4.run(PlatformImpl.java:179) at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:76) Caused by: java.lang.NullPointerException at com.sun.t2k.MacFontFinder.initPSFontNameToPathMap(MacFontFinder.java:339) at com.sun.t2k.MacFontFinder.getFontNamesOfFontFamily(MacFontFinder.java:390) at com.sun.t2k.T2KFontFactory.getFontResource(T2KFontFactory.java:233) at com.sun.t2k.LogicalFont.getSlot0Resource(LogicalFont.java:184) at com.sun.t2k.LogicalFont.getSlotResource(LogicalFont.java:228) at com.sun.t2k.CompositeSsortingke.getSsortingkeSlot(CompositeSsortingke.java:86) at com.sun.t2k.CompositeSsortingke.getMesortingcs(CompositeSsortingke.java:132) at com.sun.javafx.font.PrismFontUtils.getFontMesortingcs(PrismFontUtils.java:31) at com.sun.javafx.font.PrismFontLoader.getFontMesortingcs(PrismFontLoader.java:466) at javafx.scene.text.Text.(Text.java:153) at javafx.scene.text.Text.(Text.java:162) at com.sun.javafx.scene.control.skin.ProgressIndicatorSkin.(ProgressIndicatorSkin.java:78) ... 37 more 

Je ne peux pas simplement migrer l’application vers Java 8, toute aide est donc la bienvenue.

Mettre à jour

J’ai pu relancer l’application en ajoutant ceci au début de ma méthode principale. Des meilleures solutions sur le marché?

  try { Class macFontFinderClass = Class.forName("com.sun.t2k.MacFontFinder"); Field psNameToPathMap = macFontFinderClass.getDeclaredField("psNameToPathMap"); psNameToPathMap.setAccessible(true); psNameToPathMap.set(null, new HashMap()); } catch (Exception e) { // ignore } 

Après plus d’une semaine d’utilisation dans une application d’entreprise étendue, je n’ai constaté aucun problème dans l’interface utilisateur.

En l’absence d’une meilleure solution, j’accepte ma mise à jour ci-dessus comme réponse. Peut-être que ça aide quelqu’un …

J’ai pu relancer l’application en ajoutant ceci au début de ma méthode principale.

  try { Class macFontFinderClass = Class.forName("com.sun.t2k.MacFontFinder"); Field psNameToPathMap = macFontFinderClass.getDeclaredField("psNameToPathMap"); psNameToPathMap.setAccessible(true); psNameToPathMap.set(null, new HashMap()); } catch (Exception e) { // ignore } 

Ce n’est pas une réponse directe, mais je pensais qu’il était important de transmettre que ce bogue avait été identifié et corrigé dans une prochaine version de Java. Voir https://bugs.openjdk.java.net/browse/JDK-8143907

J’ai eu le même problème. J’ai changé le texte en étiquette. Je ne suis pas sûr que ce soit possible dans votre cas.