Миграция в 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, и он, наконец, запустился.

Другие вопросы по тегам