кастом jre с javaFX 11 - PullRequest
       70

кастом jre с javaFX 11

0 голосов
/ 24 октября 2018

Я использую JDK11 и JavaFX11.
Я создал пользовательскую JRE для своей программы-примера модуля FX, используя Jlink, но когда я пытаюсь работать с пользовательской JRE, она выдает ошибки, как показано ниже:

Вот как я создал свой пользовательский JRE (без ошибок)

jlink --module-path ..\jmods;%PATH_TO_FX% --add-modules java.base,java.desktop,jdk.unsupported,javafx.graphics --output FXJRE

Вот как я пытался запустить (с ошибками)

FXJRE\bin\java --module-path %PATH_TO_FX%;mods -m com.javafxdemo/com.javafxdemo.JavaFXDemo

Сообщения об ошибках:

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

Вот как я скомпилировал: Исходный код JavaFXDemo.java

package com.javafxdemo;

import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.stage.Stage;

public class JavaFXDemo extends Application {
    @Override
    public void start(Stage stage) {
        stage.setTitle("Hello World");
        Group root = new Group();
        Scene scene = new Scene(root, 300, 250);
        Button btn = new Button();
        btn.setLayoutX(100);
        btn.setLayoutY(80);
        btn.setText("Hello World");
        btn.setOnAction(actionEvent -> System.out.println("Hello World"));
        root.getChildren().add(btn);
        stage.setScene(scene);
        stage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}

module-info.java

module com.javafxdemo {
    requires javafx.base;
    requires javafx.graphics;
    requires javafx.controls;

    exports com.javafxdemo;
}

Вот как я скомпилировал.

javac -d mods\com.javafxdemo --module-path %PATH_TO_FX% src\com.javafxdemo\module-info.java src\com.javafxdemo\com\javafxdemo\JavaFXDemo.java

После компиляции у меня есть файлы классов модулей, как показано ниже:

├───mods
│   └───com.javafxdemo
│       │   module-info.class
│       │
│       └───com
│           └───javafxdemo
│                   JavaFXDemo.class
│
└───src
    └───com.javafxdemo
        │   module-info.java
        │
        └───com
            └───javafxdemo
                    JavaFXDemo.java

Я могу успешно запустить, как показано ниже:

java --module-path %PATH_TO_FX%;mods -m com.javafxdemo/com.javafxdemo.JavaFXDemo

Хотя я могу работать с JDK11 по умолчанию.

Как успешно создать пользовательский JRE и запустить с ним образец программы модуля FX?

Ответы [ 2 ]

0 голосов
/ 06 августа 2019

Ubuntu 18.04, Java 11, Netbeans 11.0: у меня была та же ошибка, что и у вас, потому что я установил библиотеку JavaFX11, используя файлы jar в / usr / share / openjfx / lib, которые взяты из Ubuntu openjfx 11.0.2 + 1-1~ 18.04.2 пакет.Я подумал, поскольку в этом каталоге были те же файлы jar, я мог бы его использовать, но каталог javafx-sdk-11.0.2 / lib, который вы получаете, загружая JavaFX Linux SDK из https://gluonhq.com/products/javafx/, содержит много других библиотечных файлов (например, libglass.so).), которые необходимы.

0 голосов
/ 24 октября 2018

Если вы перейдете по этой ссылке , вы заметите, что существует два варианта дистрибутива JavaFX для каждой платформы:

jmods

JavaFX SDK - это то, что вы используете как:

export PATH_TO_FX=/path/to/javafx-sdk-11/lib

, и если вы проверяете файлы в lib, это файлы jar.

JavaFX jmods на другой стороне содержит формат jmod.

И если вы читаете о jmod формате здесь :

Для большинства задач разработки, включая развертывание модулей по пути к модулю или публикацию их в репозиторий Maven, продолжайте упаковывать модули в модульные файлы JAR.Инструмент jmod предназначен для модулей с собственными библиотеками или другими файлами конфигурации или для модулей, которые вы собираетесь связать с помощью инструмента jlink с образом среды выполнения.

InДругими словами, если вы используете javac или java для запуска вашего jar или модуля, вы можете использовать SDK, но если вы используете jlink для создания пользовательской JRE, вам нужна версия jmod.

После того, как вы загрузили jmod, разархивируйте их и создайте эту переменную:

export PATH_TO_FX_JMOD=/path/to/javafx-jmods-11/

Теперь вы можете создать JRE:

jlink --module-path %PATH_TO_FX_JMOD%;mods --add-modules=com.javafxdemo --output FXJRE

и запустить:

FXJRE/bin/java -m com.javafxdemo/com.javafxdemo.JavaFXDemo
...