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?
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.
Sous Windows, variable PATH mise à jour pour contenir javafx-sdk-11/bin.
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é.