web-dev-qa-db-fra.com

Migration vers JDK 11 + JavaFX 11 donnant RuntimeException

J'ai une application sur Java 8 + JavaFX que je veux migrer vers Java 11. Le but de base est de donner un .jar aux utilisateurs sur un réseau et donc ils peuvent utiliser cette petite application. J'utilise JavaFX pour l'interface et sqlite-jdbc pour générer une base de données.

J'ai mon module-info.Java, la compilation semble être OK: pas d'erreurs. Mais si j'exécute l'application, j'ai cette erreur:

Graphics Device initialization failed for :  d3d, sw
Error initializing QuantumRenderer: no suitable pipeline found
Java.lang.RuntimeException: Java.lang.RuntimeException: Error initializing QuantumRenderer: no suitable pipeline found
    at javafx.graphics/com.Sun.javafx.tk.quantum.QuantumRenderer.getInstance(QuantumRenderer.Java:280)
    at javafx.graphics/com.Sun.javafx.tk.quantum.QuantumToolkit.init(QuantumToolkit.Java:222)
    at javafx.graphics/com.Sun.javafx.tk.Toolkit.getToolkit(Toolkit.Java:260)
    at javafx.graphics/com.Sun.javafx.application.PlatformImpl.startup(PlatformImpl.Java:267)
    at javafx.graphics/com.Sun.javafx.application.PlatformImpl.startup(PlatformImpl.Java:158)
    at javafx.graphics/com.Sun.javafx.application.LauncherImpl.startToolkit(LauncherImpl.Java:658)
    at javafx.graphics/com.Sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.Java:409)
    at javafx.graphics/com.Sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.Java:363)
    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 Java.base/Sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.Java:1051)
Caused by: Java.lang.RuntimeException: Error initializing QuantumRenderer: no suitable pipeline found
    at javafx.graphics/com.Sun.javafx.tk.quantum.QuantumRenderer$PipelineRunnable.init(QuantumRenderer.Java:94)
    at javafx.graphics/com.Sun.javafx.tk.quantum.QuantumRenderer$PipelineRunnable.run(QuantumRenderer.Java:124)
    at Java.base/Java.lang.Thread.run(Thread.Java:834)
Exception in thread "main" Java.lang.reflect.InvocationTargetException
    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 Java.base/Sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.Java:1051)
Caused by: Java.lang.RuntimeException: No toolkit found
    at javafx.graphics/com.Sun.javafx.tk.Toolkit.getToolkit(Toolkit.Java:272)
    at javafx.graphics/com.Sun.javafx.application.PlatformImpl.startup(PlatformImpl.Java:267)
    at javafx.graphics/com.Sun.javafx.application.PlatformImpl.startup(PlatformImpl.Java:158)
    at javafx.graphics/com.Sun.javafx.application.LauncherImpl.startToolkit(LauncherImpl.Java:658)
    at javafx.graphics/com.Sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.Java:409)
    at javafx.graphics/com.Sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.Java:363)
    ... 5 more

Mon module-info.Java

module AutoGeneratorOpenData {
    requires javafx.base;
    requires javafx.controls;
    requires javafx.fxml;
    requires javafx.graphics;
    requires sqlite.jdbc;
    requires Java.sql;
    requires Java.desktop;

    exports autogeneratoropendata;
}

J'utilise Netbeans 9 sur Windows 10 x64bits et JavaFX Windows SDK (dernière version 11). Je n'utilise pas Maven (mais peut-être que je dois?).

Une idée pour régler ça?

9
Drimux

Donc, il manque des bibliothèques.

  • Sous Windows, les DLL de javafx-sdk-11/bin manquants sont au moins prism_d3d.dll, prism_sw.dll, javafx_font.dll, glass.dll; vous peut tout mettre dans le répertoire jdk C:\Program Files\Java\jdk[...]\bin ( Ce n'est pas la meilleure solution ), ou dans le répertoire jlink pour un JRE personnalisé, à l'intérieur de [...]\jlink\bin\ .

  • Sous Linux, les .so manquants de javafx-sdk-11/lib sont au moins libprism_es2.os, libprism_sw.so, libglass.so, libglassgtk3.so (et libglassgtk2.so probablement aussi pour l'ancienne configuration) ), libjavafx_font.so, libjavafx_font_freetype.so, libjavafx_font_pango.so; vous pouvez tout mettre dans le /usr/lib/jvm/Java-11[...]/lib par exemple ( Ce n'est pas la meilleure solution ), ou dans le répertoire jlink pour un JRE personnalisé, à l'intérieur de [...]/jlink/lib.

  • Sur Mac, le .dylib manquant de jav javafx-sdk-11/lib doit être (je suppose!) Libprism_es2.dylib, libprism_sw.dylib, libglass.dylib, libjavafx_font.dylib [pour confirmer].

Pour utiliser le jlink, vous devez utiliser les jmods - pas besoin d'utiliser les fichiers de la librairie.

Et mon module-info.Java n'était pas vraiment complet:

module AutoGeneratorOpenData {
   requires sqlite.jdbc;
   requires javafx.controls;
   requires javafx.graphics;
   requires Java.sql;
   requires Java.desktop;
   requires javafx.fxml;
   requires javafx.base;    

   exports autogeneratoropendata;
   exports autogeneratoropendata.controller;    
   exports autogeneratoropendata.model;   
   exports autogeneratoropendata.util;

   opens autogeneratoropendata.controller;
}

Maintenant ça marche.

4
Drimux

Sous Windows, variable PATH mise à jour pour contenir javafx-sdk-11/bin.

3
Oly

Il convient également de noter que si vous utilisez Eclipse (ce que je sais que vous n'êtes pas dans ce cas) et Maven, l'ajout de dépendances pour les bibliothèques graphiques javafx spécifiques à la plate-forme (win, mac, linux) provoquera ce problème si vous essayez de construire à travers maven. Je ne sais pas vraiment pourquoi.

Je me cognais la tête contre un mur en essayant de faire juste un javafx propre: exécutez les objectifs avant de supprimer les dépendances dépendantes de la plate-forme dans le pom et il a finalement fonctionné.

0
Chris Toh