Как добавить среду выполнения javaFx к затмению на java 11?
Я получаю следующую ошибку, поскольку Java 11 исключил JavaFX как часть последней версии.
Error: JavaFX runtime components are missing, and are required to run this application
Спасибо
1 ответ
Следуя руководству по началу работы, это необходимые шаги для запуска JavaFX 11 из Eclipse.
1 Установите Eclipse 2018-09 отсюда.
2 Установите JDK 11 отсюда.
3 Добавьте Java 11 в качестве установленной JRE в Eclipse: Eclipse -> Window -> Preferences -> Java -> Installed JREs -> Add.
4 Загрузите JavaFX 11 ea отсюда.
5 Создайте пользовательскую библиотеку: Eclipse -> Window -> Preferences -> Java -> Build Path -> User Libraries -> New. Назовите его JavaFX11 и включите файлы jar в папку lib из JavaFX 11-ea.
6 Создайте проект Java. Вам не нужно добавлять класс модуля-пути. Убедитесь, что вы выбрали Java 11 и добавили библиотеку JavaFX11 в путь модуля проекта.
7 Добавить пакет javafx11
и основной класс приложения HelloFX
:
package javafx11;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
public class HelloFX extends Application {
@Override
public void start(Stage stage) {
String version = System.getProperty("java.version");
Label l = new Label ("Hello, JavaFX 11, running on "+version);
Scene scene = new Scene (new StackPane(l), 300, 200);
stage.setScene(scene);
stage.show();
}
public static void main(String[] args) {
launch();
}
}
Обратите внимание, что редактор не должен жаловаться на классы JavaFX, так как мы включили пользовательскую библиотеку.
8 Добавьте аргументы времени выполнения. Отредактируйте конфигурацию запуска проекта и добавьте следующие аргументы VM:
--module-path C:\Users\<user>\Downloads\javafx-sdk-11\lib --add-modules=javafx.controls
9 Наконец, запустите проект. Это должно работать нормально.
Я хотел бы поделиться своими выводами о запуске приложения javafx 11. Я говорю о существующем унаследованном приложении javafx, изначально разработанном без модулей (например, w/ Java 8).
Наиболее интересным способом IMO является метод № 2b, приведенный ниже, который требует минимума изменений, т.е. -module-path
аргумент. Я упоминаю, что я использую Maven, поэтому ср. предыдущие ответы первым шагом является добавление зависимости в ваш pom.xml
в сторону javafx. Например:
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-controls</artifactId>
<version>11.0.2</version>
</dependency>
Для запуска я нашел несколько вариантов:
1a) Запустить используя maven из командной строки
Настроить в своем pom.xml
раздел как:
<build>
<plugins>
...
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>1.6.0</version>
<executions>
<execution>
<goals>
<goal>java</goal>
</goals>
</execution>
</executions>
<configuration>
<mainClass>org.openjfx.hellofx.MainApp</mainClass>
</configuration>
</plugin>
</plugins>
</build>
После этого из окна консоли вы можете запустить mvn exec:java
и это должно запустить приложение. Maven позаботится о добавлении всех записей из classpath в путь к модулю. Я напоминаю CTRL + ALT + T
ярлык в Eclipse, который открывает окно терминала прямо в IDE.
1b) Запуск с использованием Maven, но в качестве конфигурации запуска Eclipse
Щелкните правой кнопкой мыши по проекту> Run As> Maven Build.... Затем введите exec:java
в текстовом поле Цели. Преимущество по сравнению с предыдущим методом: немного более интегрированный в Eclipse. И легкая отладка. Вам нужно только перезапустить конфигурацию запуска в режиме отладки и все. Могу ли я напомнить, что конфиги запуска Eclipse могут быть сохранены как .launch
файлы непосредственно в проекте dir (репо), поэтому коллеги могут совместно использовать их. Используйте последнюю вкладку Common в окне Edit Configuration.
2a) Запустить с использованием Eclipse и указать -module-path
используя переменную
Щелкните правой кнопкой мыши основной класс> Запуск от имени> Java-приложение. При первом щелчке создается новая конфигурация запуска; возможно, это не сработает, поэтому вам нужно отредактировать его (например, ** кнопку "Выполнить" (со значком "Play") на панели инструментов> "Запустить конфигурации"> выберите тот, который соответствует вашему классу. CTRL + click
на это после нажатия на Play).
Затем добавьте это в Аргументы> VM аргументы:
--module-path ${project_classpath:REPLACE_ME_WITH_YOUR_PROJECT_NAME} --add-modules javafx.controls,javafx.fxml
Так что хитрость здесь заключалась в том, чтобы использовать ${project_classpath}
переменная. Потому что в противном случае вам нужно было бы написать точно путь к банке javafx, которая находится где-то в вашем .m2
Сделки РЕПО. Это может затруднить повторное использование конфигурацией запуска коллегами.
2b) Запуск с использованием Eclipse БЕЗ указания -module-path
Это часть существования, которую я обнаружил по ошибке после примерно 5 часов Java 11 и модулей "веселья". Ваше приложение может работать из коробки, не касаясь -module-path
, Разумеется, библиотеки javafx все еще должны быть в вашем classpath (но это обрабатывается mvn). Хитрость заключается в том, что ваше основное приложение НЕ ДОЛЖНО расширяться Application
(например MyApplication
ниже). Если это ваш случай, то создайте новый класс с main()
функция, которая делает, например:
Application.launch(MyApplication.class);
НОТА
В моем случае (то есть в Windows с JDK 8 по умолчанию в системе) существует известная проблема с запуском javafx. Решение состоит в том, чтобы добавить следующий аргумент VM: -Djava.library.path=C:
, Так что на самом деле для всех 4 методов, описанных выше, мне нужно было добавить это.
У меня были проблемы с FXMLLoader
... не смог найти класс.
Я решил это, изменив приведенные выше аргументы, чтобы загрузить все модули, а не только javafx.controls
:
--module-path <path to the javafx sdk> --add-modules=ALL-MODULE-PATH
Как упоминалось @Cristian, создание отдельного класса Main, похоже, помогает без каких-либо других аргументов.
public class Main {
public static void main(String[] args) {
Application.launch(MainWindow.class);
}
}
public class MainWindow extends Application {
@Override
public void start(Stage stage) {
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);
stage.setScene(scene);
stage.show();
}
// do not use this method
// public static void main(String[] args) {
// Application.launch(MainWindow.class);
// }
}
@ Хосе Переда совершенно прав, все работает как надо. Я проверил это с выпуском Eclipse 2018-12. Итак, после загрузки среды IDE ( https://www.eclipse.org/downloads/packages/release/2018-12/r/eclipse-ide-java-developers) и установки плагина e(fx)clipse вам необходимо быть в состоянии создать элемент "JavaFx Project" в вашей рабочей области.
Следующим шагом является удаление "JavaFX SDK" из модуля "Classpath" (Свойства -> Путь сборки Java -> Библиотеки) и добавление зависимости Maven для удаления ошибок компиляции:
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-controls</artifactId>
<version>11.0.1</version>
</dependency>
Последний шаг - добавить аргумент VM в "Run Configuration" вашего класса JavaFX для запуска приложения (Run Configurations -> вкладка Arguments -> VM arguments):
--module-path C:\path to the OpenJFX\javafx-sdk-11.0.1\lib --add-modules=javafx.controls
и это должно работать после того, как вы запустите его. Конечно, вы должны загрузить JavaFX SDK до этого ( https://gluonhq.com/products/javafx/), разархивировать его и использовать путь к папке "lib" в вышеупомянутом аргументе VM.
Используя совет Carlao2005, я смог составить полное руководство по тому, как заставить JavaFX работать в Eclipse теперь, когда JavaFX не поставляется с Java SDK. Предполагается, что у вас есть Eclipse с установленным плагином E(FX)clipse и установленным JavaFX SDK. Обратите внимание: важно, чтобы JavaFX SDK был установлен в месте без пробелов в пути, поэтому C:/Program Files не является хорошим выбором.
Выполняйте этот шаг для создания каждого нового проекта Java FX. Сначала перейдите в файл> новый> другой и найдите вариант для создания нового проекта Java FX. После создания проекта вы заметите, что он не компилируется, поскольку Eclipse необходимо знать о библиотеках JavaFX. Откройте свойства проекта и найдите путь сборки Java. Выберите вкладку "Библиотеки", а затем - путь к модулю. Затем нажмите кнопку " Добавить библиотеку", а затем выберите опцию " Пользовательская библиотека", прежде чем нажимать " Далее".
В появившемся окне выберите новый и назовите библиотеку JavaFX13. Выберите добавить внешние jar-файлы, а затем найдите папку lib в каталоге установки JavaFX 13 и выберите все папки.jar, затем примените и закройте или завершите все окна.
Если вы попытаетесь запустить проект, вы обнаружите, что он не сможет найти application.main. Чтобы исправить это, у нас есть последний шаг. Щелкните правой кнопкой мыши main.java в проводнике пакетов Eclipse. Выберите " Запуск от имени"> " Выполнитьконфигурации", а затем выберите вкладку "Аргументы". В аргументы vm добавьте следующее (где путь к модулю указывает на вашу установку Java FX sdk):
--module-path C:\Programs\Java\javafx-sdk-13.0.1\lib --add-modules=ALL-MODULE-PATH
Вот и все, теперь вы можете запустить проект Java FX и увидеть окно по умолчанию. Если вы работаете в Mac OS, снимите флажок аргумента -XstartOnFirstThread при запуске SWT, если у вас возникли проблемы с отображением окна.