Миграция в JDK 11 + JavaFX 11 дает исключение RuntimeException
У меня есть приложение на Java 8 + JavaFX, которое я хочу перенести на Java 11. Основная цель - предоставить.jar пользователям в сети, чтобы они могли использовать это небольшое приложение. Я использую JavaFX для интерфейса и sqlite-jdbc для создания базы данных.
У меня есть свой module-info.java, компиляция вроде бы в порядке: ошибок нет. Но если я запускаю приложение, я получаю эту ошибку:
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
Мой модуль-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;
}
Я использую Netbeans 9 на Windows 10 x64bit и JavaFX Windows SDK (последняя версия 11). Я не использую Maven (но, может быть, я должен?).
Есть идеи, чтобы это исправить?
5 ответов
Итак, есть некоторые недостающие библиотеки.
В Windows отсутствующими DLL из javafx-sdk-11 / bin являются, по крайней мере, prism_d3d.dll, prism_sw.dll, javafx_font.dll, glass.dll; Вы можете положить все в каталог JDK
C:\Program Files\Java\jdk[...]\bin
(Это не лучшее решение)или в каталог jlink для пользовательского JRE, внутри[...]\jlink\bin\
,В Linux отсутствующими.so из javafx-sdk-11 / lib являются как минимум libprism_es2.os, libprism_sw.so, libglass.so, libglassgtk3.so (и libglassgtk2.so, вероятно, слишком для старой конфигурации), libjavafx_font.so, libjavafx_font_freetype.so, libjavafx_font_pango.so; Вы можете положить все в
/usr/lib/jvm/java-11[...]/lib
например (это не лучшее решение)или в каталог jlink для пользовательского JRE, внутри[...]/jlink/lib
,На Mac отсутствующий.dylib из jav javafx-sdk-11 / lib должен быть (я полагаю!) Libprism_es2.dylib, libprism_sw.dylib, libglass.dylib, libjavafx_font.dylib [Подтвердить].
Чтобы использовать jlink, вы должны использовать jmods - не нужно использовать файлы librairy.
И мой модуль-info.java не был действительно полным:
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;
}
Теперь это работает.
В Windows обновлена переменная PATH, чтобы содержать javafx-sdk-11/bin.
Пожалуйста, используйте последнюю версию JavaFX, многие ошибки были исправлены.
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-fxml</artifactId>
<version>15</version>
</dependency>
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-controls</artifactId>
<version>15</version>
</dependency>
Вы также можете использовать:
System.setProperty("java.library.path", "path/to/javafx-sdk-11.0.x/lib");
где path/to/javafx-sdk-11.0.x/lib
это путь к библиотеке JavaFX (или для Windows, bin
) каталог.
Обратите внимание, что этот метод будет работать, если приложение JavaFX запускается из вторичного класса. Для запуска приложения JavaFX непосредственно из его собственного класса требуется модульная система (например,module-info.java
и т. д.), так как JDK9.
Следует также отметить, что если вы используете Eclipse (что я знаю, что вы не в этом случае) и Maven, добавление зависимостей для конкретных платформ javafx-графических библиотек (win, mac, linux) вызовет эту проблему, если вы попытаетесь построить через maven. Я не совсем понимаю, почему.
Я бился головой о стену, пытаясь просто сделать чистый javafx:run в целях, прежде чем я просто удалил зависимости, зависящие от платформы, в pom, и он, наконец, запустился.