JavaFX 11: компоненты среды выполнения JavaFX отсутствуют

Я пытаюсь запустить образец кода JavaFX (взятый из 5-го издания Java Illuminated) под JavaFX 11 и Java 11, используя jGRASP 2 под Windows 10.

Я прочитал руководство «Начало работы с JavaFX» (https://openjfx.io/openjfx-docs/), и хотя я добился некоторого прогресса, я застрял.

Я загрузил последний ZIP-файл, распаковал его и обновил CLASSPATH, включив в него путь к файлам jar, необходимым для компиляции. Я могу успешно скомпилировать файл. Однако при попытке запустить появляется следующее сообщение об ошибке:

Ошибка: компоненты среды выполнения JavaFX отсутствуют и необходимы для запуска этого приложения.

В руководстве «Приступая к работе» говорится, что это можно исправить, добавив следующие параметры к вызову среды выполнения:

--module-path "[путь] \ lib" --add-modules = javafx.controls, javafx.fxml

Я добавил параметры, но сообщение об ошибке все равно появляется.

Предыдущие статьи StackOverflow обычно заканчиваются указанным выше параметром; увы, я не могу понять, что еще делать.


person Jim Huggins    schedule 13.02.2019    source источник
comment
В параметрах времени выполнения вы изменили путь, чтобы указать папку с библиотекой JavaFX: "[path]\lib" Дополнительный вопрос: когда вы говорите, что добавили путь к классам, чтобы включить jar, вы добавили его в путь к классам Windows или путь к классам IDE?   -  person sorifiend    schedule 13.02.2019
comment
1) Да, [путь] заменяется фактическим путем к библиотеке --- в моем случае буквально C: \ Program Files \ Java \ javafx-sdk-11.0.2 \ lib   -  person Jim Huggins    schedule 13.02.2019
comment
2) Я изменил путь к классам IDE.   -  person Jim Huggins    schedule 13.02.2019


Ответы (2)


Как первый пользователь, мне удалось заставить его работать, но для меня это было непросто.

Думаю, мало кто знаком с этой IDE, поэтому я опубликую шаги, которые я выполнил, в качестве базового руководства:

  • Загрузите и установите версию jGRASP 2.0.5_05 Бета.

  • Поскольку у меня установлено несколько JDK, он по умолчанию выбрал JDK 10.0.2, поэтому моим первым шагом было найти способ работы с JDK 11. Это можно сделать в Settings -> jGrasp Startup Settings, где я могу указать путь для моего java исполняемого файла:

SetJDK 11

Затем я перезапустил jGrasp. Вы можете проверить, какой JDK использует IDE в Tools -> System Info -> Java Version.

  • Откройте образец класса HelloFX. Я начал с самого простого примера из документации OpenJFX. Код можно найти здесь.

  • Build -> compile, как и ожидалось, выдаст кучу ошибок, учитывая, что JavaFX больше не является частью JDK:

Ошибка компиляции

  • Следуя документации OpenJFX, нам необходимо загрузить JavaFX SDK с здесь, а затем добавить библиотеку в путь к классам. Перейдите к Settings -> PATH/CLASSPATH -> Workspace, нажмите «Создать» и добавьте, один за другим, разные jar-файлы JavaFX из загруженной папки SDK / lib (как минимум javafx-base.jar, javafx-graphics.jar и javafx-controls.jar).

  • Build -> compile теперь должен работать.

  • Следующий шаг: Build -> Run. Это не удается:

----jGRASP exec: java HelloFX
Error: JavaFX runtime components are missing, and are required to run this application

 ----jGRASP wedge: exit code for process is 1.
 ----jGRASP: operation complete.

Это было ожидаемо. Согласно документации, нам нужно установить аргументы module-path и add-modules.

  • Первая попытка: используйте Run arguments. После установки:
--module-path /Users/<user>/Downloads/javafx-sdk-11.0.2/lib --add-modules javafx.controls

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

----jGRASP exec: java HelloFX --module-path /Users/<user>/Downloads/javafx-sdk-11.0.2/lib --add-modules javafx.controls

Что случилось с этим!? Что ж ... если вы попробуете это в командной строке, это тоже не удастся, потому что порядок аргументов неправильный, аргументы vm должны идти перед именем класса.

В заключение: Run arguments не VM arguments!

  • Вторая попытка: чтобы предоставить аргументы виртуальной машины, я нашел вариант отредактировать Settings -> Compiler settings -> Workspace. По умолчанию используется jdk (integrated debugger) - generic. Вы можете просмотреть его и увидеть, что Run он использует:
java %S -ea %S %<FLAGS2> %<MAIN_CLASS> %<ARGS>

Поэтому вместо ARGS нам нужно найти способ установить FLAGS2.

К счастью, рядом с вкладкой Environment есть вкладка Flags/Args, и там мы можем установить наши аргументы vm в FLAGS2:

--module-path /Users/<user>/Downloads/javafx-sdk-11.0.2/lib --add-modules javafx.controls

Аргументы ВМ

  • Примените, закройте диалог и Build -> Run класс, теперь он будет работать!

Если вы видите журнал консоли, он содержит именно ту команду, которую вы использовали бы при запуске в командной строке:

----jGRASP exec: java --module-path /Users/<user>/Downloads/javafx-sdk-11.0.2/lib --add-modules javafx.controls HelloFX

 ----jGRASP: operation complete.

Думаю, следующим шагом будет запуск более сложного проекта ...

person José Pereda    schedule 13.02.2019
comment
Когда вы напечатали это, я получил независимое подтверждение этого решения, которое мне действительно подходит. Ты напечатал это намного лучше, чем я собирался. Спасибо! - person Jim Huggins; 13.02.2019
comment
Полезно знать, надеюсь, это краткое руководство может быть полезно и другим! - person José Pereda; 13.02.2019

Попробуйте просто создать средство запуска только с основным методом. Это могло выглядеть примерно так:

package application;

import javafx.application.Application;

public class MyAppLauncher {

    public static void main(final String[] args) {
        Application.launch(MyApp.class, args);
    }
}

(вы можете пока оставить старый основной метод в своем приложении неиспользованным). У меня это сработало с JDK 13, JavaFX 13 и Eclipse 2019-12 под Ubuntu.
(Я создал проект, используя «новый / Maven Project / Simple Project », а затем просто добавил JavaFX, Logging и другие вещи в качестве зависимостей в pom.xml, которые все попали в Classpath. Только JDK был в Modulepath)
Не нужно беспокоиться о модулях Java.

Если это сработает, вы можете потратить время, чтобы узнать о Java Modularisation в другой день ...
... и не забудьте проголосовать за этот ответ. :-)

person Dave The Dane    schedule 28.12.2019