Я пытаюсь адаптировать мою программу для работы с Java 12. В настоящее время она работает с Java 8 и имеет некоторые компоненты JavaFX (несколько диалогов). Это не модульно. Моя IDE - это Eclipse, а файлы JAR JavaFX включены в путь сборки в виде пользовательской библиотеки. Я хотел бы создать исполняемый файл jar и либо связать файлы javafx внутри, либо добавить их в пользовательский JRE, чтобы я мог распространять его, не требуя от конечного пользователя установки Java12 или JavaFX отдельно.
Для начала я решил поэкспериментировать с простой HelloFX программой, модифицированной так, чтобы она больше напоминала мою программу.
public class HelloFX2 {
public HelloFX2() {
startToolkit();
// have to wait a second for the JavaFX thread to actually start, or else the Platform.runLater throws an exception
try
{
Thread.sleep(1000);
}
catch(InterruptedException ex)
{
Thread.currentThread().interrupt();
}
// create the scene and display
Platform.runLater(() -> {
Scene theScene = createTheScene();
final Stage stage = new Stage();
stage.setScene(theScene);
stage.show();
});
}
public Scene createTheScene() {
String javaVersion = System.getProperty("java.version");
String javafxVersion = System.getProperty("javafx.version");
Label l = new Label("Hello, JavaFX " + javafxVersion + ", running on Java " + javaVersion + ".");
Scene scene = new Scene(new StackPane(l), 640, 480);
return scene;
}
public void startToolkit () {
// we can only create a Scene in a JavaFX thread
SwingUtilities.invokeLater(() -> {
// Initialize FX Toolkit, so that we can use the Java FX objects
new JFXPanel();
});
}
}
Я также использовал для запуска класс Main согласно этому предложению . Я не думаю, что мне это нужно в моем случае, потому что HelloFX2 не расширяет Application
, но опять же, это ближе к тому, как выглядит моя настоящая программа.
public class Main2 {
public static void main(String[] args) {
HelloFX2 theApp = new HelloFX2();
}
}
Программа отлично работает в Eclipse. Я экспортирую как исполняемый файл JAR с опцией «Извлечь библиотеки», а затем использую jdeps
и jlink
для создания пользовательского JRE:
D:\Work\Java12>"C:\Program Files\Java\jdk-12.0.1\bin\jdeps" --ignore-missing-deps --print-module-deps HelloFX2.jar
java.base,java.desktop
D:\Work\Java12>"C:\Program Files\Java\jdk-12.0.1\bin\jlink" --no-header-files --no-man-pages --add-modules java.base,java.desktop --output java-runtime
Но когда я пытаюсь запустить его, я получаю эту ошибку:
D:\Work\Java12>"java-runtime\bin\java" -jar HelloFX2.jar
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 com.sun.javafx.tk.quantum.QuantumRenderer.getInstance(QuantumRenderer.java:280)
at com.sun.javafx.tk.quantum.QuantumToolkit.init(QuantumToolkit.java:243)
at com.sun.javafx.tk.Toolkit.getToolkit(Toolkit.java:260)
at com.sun.javafx.application.PlatformImpl.startup(PlatformImpl.java:267)
at com.sun.javafx.application.PlatformImpl.startup(PlatformImpl.java:158)
at javafx.embed.swing.JFXPanel.lambda$initFx$1(JFXPanel.java:224)
at java.base/java.lang.Thread.run(Thread.java:835)
Caused by: java.lang.RuntimeException: Error initializing QuantumRenderer: no suitable pipeline found
at com.sun.javafx.tk.quantum.QuantumRenderer$PipelineRunnable.init(QuantumRenderer.java:94)
at com.sun.javafx.tk.quantum.QuantumRenderer$PipelineRunnable.run(QuantumRenderer.java:124)
... 1 more
Exception in thread "AWT-EventQueue-0" java.lang.RuntimeException: No toolkit found
at com.sun.javafx.tk.Toolkit.getToolkit(Toolkit.java:272)
at com.sun.javafx.application.PlatformImpl.startup(PlatformImpl.java:267)
at com.sun.javafx.application.PlatformImpl.startup(PlatformImpl.java:158)
at javafx.embed.swing.JFXPanel.lambda$initFx$1(JFXPanel.java:224)
at java.base/java.lang.Thread.run(Thread.java:835)
Это та же ошибка, что и в исходной программе HelloFX, когда вы не добавляете ключ --module-path в командную строку, но мне это не нужно, потому что я не расширяю Application
.
JavaFX не найден? Все файлы классов JavaFX включены в jar, но я не уверен, как на них указывать.