Tengo un navegador web JavaFX simple que es un módulo. La estructura de directorios del módulo es:
webBrowser webBrowser/module-info.java webBrowser/webbrowser webBrowser/webbrowser/WebBrowser.java
Aquí está el código para module-info.java
module webBrowser { requires javafx.controls; requires javafx.web; exports webbrowser; }
Aquí está el código para WebBrowser.java:
package webbrowser; import javafx.application.Application; import javafx.scene.Scene; import javafx.scene.web.WebView; import javafx.scene.web.WebEngine; import javafx.stage.Stage; public class WebBrowser extends Application { @Override public void start(Stage stage) { WebView browser = new WebView(); WebEngine webEngine = browser.getEngine(); webEngine.load("http://www.oracle.com"); Scene scene = new Scene(browser, 1200, 900); stage.setScene(scene); stage.show(); } public static void main(String[] args) { launch(); } }
Compilo mi aplicación modular con javac:
% javac -d out --module-source-path . --module-path $JAVAFX --module webBrowser
Puedo iniciar mi aplicación con Java y funciona bien:
% java --module-path out:$JAVAFX/lib --module webBrowser/webbrowser.WebBrowser
El problema comienza cuando intento ensamblar mi módulo (webBrowser) y los módulos JavaFX usando jlink:
% jlink --module-path out:$JAVAFX/lib --add-modules webBrowser,javafx.controls,javafx.web --output myjre % myjre/bin/java --list-modules java.base@17.0.1 java.datatransfer@17.0.1 java.desktop@17.0.1 java.net.http@17.0.1 java.prefs@17.0.1 java.xml@17.0.1 javafx.base javafx.controls javafx.graphics javafx.media javafx.web jdk.jsobject@17.0.1 jdk.unsupported@17.0.1 jdk.xml.dom@17.0.1 webBrowser % myjre/bin/java --module webBrowser/webbrowser.WebBrowser Graphics Device initialization failed for : es2, 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:283) at javafx.graphics/com.sun.javafx.tk.quantum.QuantumToolkit.init(QuantumToolkit.java:254) at javafx.graphics/com.sun.javafx.tk.Toolkit.getToolkit(Toolkit.java:264) at javafx.graphics/com.sun.javafx.application.PlatformImpl.startup(PlatformImpl.java:291) at javafx.graphics/com.sun.javafx.application.PlatformImpl.startup(PlatformImpl.java:163) at javafx.graphics/com.sun.javafx.application.LauncherImpl.startToolkit(LauncherImpl.java:659) at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:410) at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:364) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:568) at java.base/sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.java:1071) 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:95) at javafx.graphics/com.sun.javafx.tk.quantum.QuantumRenderer$PipelineRunnable.run(QuantumRenderer.java:125) at java.base/java.lang.Thread.run(Thread.java:833) 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:77) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:568) at java.base/sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.java:1071) Caused by: java.lang.RuntimeException: No toolkit found at javafx.graphics/com.sun.javafx.tk.Toolkit.getToolkit(Toolkit.java:276) at javafx.graphics/com.sun.javafx.application.PlatformImpl.startup(PlatformImpl.java:291) at javafx.graphics/com.sun.javafx.application.PlatformImpl.startup(PlatformImpl.java:163) at javafx.graphics/com.sun.javafx.application.LauncherImpl.startToolkit(LauncherImpl.java:659) at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:410) at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:364) ... 5 more
Cuando ejecuto mi aplicación vinculada (arriba), obtengo esta RuntimeException:
java.lang.RuntimeException: Error initializing QuantumRenderer: no suitable pipeline found
Notas sobre el montaje
Estoy usando jlink para ensamblar tres módulos: javafx.controls, javafx.web y webBrowser.
Pregunta
Mi aplicación funciona bien con Java. Se inicia y funciona correctamente cuando uso este comando:
% java --module-path out:$JAVAFX/lib --module webBrowser/webbrowser.WebBrowser
Pero recibo un mensaje de error (Error al inicializar QuantumRenderer: no se encontró una canalización adecuada) cuando intento iniciar la imagen en tiempo de ejecución:
% myjre/bin/java --module webBrowser/webbrowser.WebBrowser
¿Por qué aparece este mensaje de error cuando intento iniciar la imagen de tiempo de ejecución? ¿Cómo puedo hacer que mi navegador web se ensamble y se inicie correctamente?
Consulte este problema relacionado en el rastreador de openjfx e intente seguir los consejos y los pasos de solución de problemas que se encuentran allí.
Especialmente esta sección sobre la descarga y el uso de los archivos mod en lugar del sdk.
La razón es que está empaquetando los "mods" del SDK, que no tienen las bibliotecas nativas (en el SDK, tenemos jars y bibliotecas nativas).
Puede descargar los módulos JavaFX como jmods, incluidas las clases y las bibliotecas nativas.
Ver:
y descargue los mods (en lugar del SDK).
A continuación, apunta jlink al directorio de mods.
Aparentemente, el paquete SDK es diferente a otros tipos de distribución como Maven. El paquete SDK separa las clases de Java y las bibliotecas nativas, mientras que el paquete para otras plataformas de entrega no lo hace, por lo que puede ejecutar el SDK, pero no vincularlo.
Consulte la sección de documentos de openjfx sobre cómo crear un tiempo de ejecución desde la línea de comandos. La ruta a usar en el comando jlink se da como
--module-path $PATH_TO_FX_MODS:mods
no
--module-path out:$JAVAFX/lib