我正在使用JDK11和JavaFX11。
我使用Jlink为我的示例FX模块程序创建了一个自定义JRE,但是当我尝试使用自定义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模块程序?
发布于 2018-10-24 15:37:40
如果您进入这个链接,您会注意到每个平台的JavaFX发行版有两种风格:
JavaFX SDK是您正在用作:
export PATH_TO_FX=/path/to/javafx-sdk-11/lib
如果您检查lib
下的文件,这些文件就是jars。
另一方面的JavaFX jmods包含jmod格式。
如果你读到关于jmod
格式的这里
对于大多数开发任务,包括在模块路径上部署模块或将它们发布到Maven存储库,继续将模块打包到模块化JAR文件中。jmod工具用于具有本机库或其他配置文件的模块,或者用于您打算与jlink工具链接到运行时映像的模块。
换句话说,如果使用javac
或java
运行jar或模块,则可以使用SDK,但如果使用jlink
创建自定义JRE,则需要jmod
版本。
下载jmods之后,解压缩它们并创建以下变量:
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
发布于 2019-08-06 06:36:33
Ubuntu18.04、Java 11、Netbeans 11.0:我的错误与您相同,因为我使用Ubuntuopenjfx11.0.2+1-1~18.04.2包中的jars设置了/usr/ JavaFX11 / openjfx /lib中的jars。我想,因为这个目录中有相同的jars,所以我可以使用它,但是从JavaFX下载https://gluonhq.com/products/javafx/ Linux所得到的JavaFXSDK-11.0.2/lib目录包含许多其他需要的库文件(比如libglass.so)。
https://stackoverflow.com/questions/52966195
复制相似问题