JavaFX-11 с VSCode
Я, должно быть, упускаю что-то очевидное здесь... Я экспериментирую с VSCode (из Eclipse), но я не могу получить VSCode, чтобы увидеть библиотеки JavaFX11. В операторах импорта все ссылки на компоненты JavaFX отмечены:
[Java] The import javafx cannot be resolved
В Eclipse это обрабатывается с помощью "Пользовательской библиотеки", которая генерирует запись в.classpath
<classpathentry kind="con" path="org.eclipse.jdt.USER_LIBRARY/JavaFX11">
<attributes>
<attribute name="module" value="true"/>
</attributes>
</classpathentry>
Хотя VSCode, по-видимому, понимает остальную часть.classpath из Eclipse, он этого не понимает. Замена атрибута пути фактическим местоположением на диске также не работает.
Для ясности:
- Этот вопрос относится именно к Java 11. В более ранних версиях Java JavaFX был частью JDK. В Java 11 он был перенесен в набор внешних модулей.
- Я не хочу использовать Maven или Gradle. Мне нужно напрямую ссылаться на модули без использования инструмента сборки.
Для дополнительных очков было бы хорошо, если бы VSCode мог также непосредственно выполнить приложение JavaFX. Тем не менее, это приемлемо, если мне нужно запустить приложение из командной строки с явными путями модулей и классов
3 ответа
Я собираюсь запустить пример HelloFX для Eclipse из примеров OpenJFX.
После того, как я открываю образец с помощью VSCode, я вижу сообщение об ошибке: [Java] The import javafx cannot be resolved [268435846]
,
Это, очевидно, означает, что классы JavaFX не разрешены, и даже если в файле.classpath есть запись:
<classpathentry kind="con" path="org.eclipse.jdt.USER_LIBRARY/JavaFX11"/>
эта библиотека не может быть решена.
Решение JavaFX SDK
Итак, я собираюсь заменить эту переменную фактическими банками из моего локального JavaFX SDK:
<classpathentry kind="lib" path="/Users/<user>/Downloads/javafx-sdk-11.0.2/lib/javafx.base.jar"/>
<classpathentry kind="lib" path="/Users/<user>/Downloads/javafx-sdk-11.0.2/lib/javafx.graphics.jar"/>
<classpathentry kind="lib" path="/Users/<user>/Downloads/javafx-sdk-11.0.2/lib/javafx.controls.jar"/>
<classpathentry kind="lib" path="/Users/<user>/Downloads/javafx-sdk-11.0.2/lib/javafx.fxml.jar"/>
После обновления проекта я вижу под JAVA DEPENDENCIES
эти банки.
Хотя ошибка кажется решенной, проект все равно не может быть собран.
Решение JRE
Нам нужно установить JDK 11 для проекта, поэтому скачайте его отсюда. Затем откройте Eclipse и добавьте его в установленные JRE. Я вижу под Java -> Installed JREs -> Execution Environments
что название для версии 11 JavaSE-11
,
.classpath
Файл из проекта helloFX также содержит ссылку на JRE:
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/
org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JDK11">
<attributes>
<attribute name="module" value="true"/>
</attributes>
</classpathentry>
так что я собираюсь заменить JDK11
с JavaSE-11
и обновите проект. Я могу видеть под JAVA DEPENDENCIES
что есть ссылка на JRE System Library [JavaSE-11]
,
Решение JAVA_HOME
Нам нужно установить java.home
в VSCode.
Это можно сделать в settings.json
из `Настройки-> Настройки-> Настройки рабочего пространства:
{
"java.dependency.packagePresentation": "hierarchical",
"java.home":"/Users/<user>/Downloads/jdk-11.0.2.jdk/Contents/Home"
}
После его изменения вы получите всплывающее окно с сообщением Java Language Server configuration changed, please restart VS Code.
, так что перезапустите его.
Пробовать
Мы видим, что ошибок нет, есть даже bin
папка с результатом сборки, которую автоматически делает VSCode.
Можем ли мы запустить это? Если мы попробуем это, мы получим ошибку:
Error: JavaFX runtime components are missing, and are required to run this application
Эта ошибка появляется при использовании JavaFX 11 без указания пути к модулю.
Решение ВМ аргументов
Последний шаг состоит в добавлении необходимых аргументов vm.
Это можно сделать в launch.json
файл. Он содержит конфигурацию по умолчанию, которую мы можем изменить, добавив новую запись для vmArgs
в том числе --module-path
с локальным путем к JavaFX SDK и --add-modules
с необходимыми модулями JavaFX:
{
"configurations": [
{
"type": "java",
"name": "CodeLens (Launch) - Main",
"request": "launch",
"vmArgs": "--module-path /Users/<user>/Downloads/javafx-sdk-11.0.2/lib
--add-modules javafx.controls,javafx.fxml",
"mainClass": "hellofx.Main",
"projectName": "hellofx"
}
]
}
Теперь у нас все установлено.
Запустите проект еще раз, и он должен работать.
Обратите внимание, что я впервые пользуюсь VSCode, поэтому, возможно, я упустил что-то очевидное, и, возможно, некоторых из этих шагов можно было бы избежать или упростить.
launch.json
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"type": "java",
"name": "Launch Current File",
"request": "launch",
"mainClass": "${file}"
},
{
"type": "java",
"request": "launch",
"vmArgs": "--module-path /Volumes/Data/kits/installations/javafx-sdk-15.0.1/lib --add-modules=javafx.controls,javafx.fxml,javafx.graphics",
"mainClass": "application.Main",
"name": "Launch Main",
"projectName": "GooDay"
}
]
}
добавьте это в настройки json
"java.dependency.packagePresentation": "hierarchical",
"java.home":"/Library/Java/JavaVirtualMachines/jdk-15.0.1.jdk/Contents/Home"
Я думаю, что нашел более простой ответ!
- Запустите исполняемый файл, который устанавливает ваш JDK, например: jdk-8u201-windows-x64
- Переустановите и выберите дополнительные функции, включая JavaFX, установленные локально.
После завершения установки Visual Studio смогла просмотреть файлы, и доступ к ним больше не был ограничен.
Если это не сработало, я делал две другие вещи раньше, пока решал проблему (ни одна из них не решила проблему, но одна из них могла повлиять на результат переустановки JDK):
Я добавил косую черту в конец пути к JDK, например: "C:\Program Files\Java\jdk1.8.0_201\"
- Перед переустановкой JDK я подключил к нему затмение и добавил правило неограниченного доступа