Мне не удается заставить IntellJ распознавать пакеты JavaFX. В новом проекте JavaFX с OpenJDK 11 при попытке создать проект IntelliJ не может распознать пакеты JavaFX.
Я импортировал openjfx:javafx-base-11
из репозитория Maven.
Я рассмотрел другие вопросы, и решения, похоже, варьируются от проверки того, что байт-код находится на правильном уровне (мой), и что язык проекта правильный (мой).
У кого-нибудь есть идеи?
Редактировать:
Ошибка:
module-info.java
module-info.java
файл в исходной папке и явно требуют какой бы ни модулей JavaFX , что вы используете:requires javafx.controls;
,requires javafx.graphics;
и т.д.Ответы:
Как упоминалось в комментариях, Начальное руководство - это место, с которого можно начать с Java 11 и JavaFX 11.
Ключ к тому, чтобы работать так, как вы работали до Java 11, - это понимать, что:
Проект JavaFX
Если вы создаете обычный проект JavaFX по умолчанию в IntelliJ (без Maven или Gradle), я бы посоветовал вам загрузить SDK отсюда . Обратите внимание, что есть также jmods, но для немодульного проекта предпочтительнее SDK.
Вот простые шаги для запуска проекта по умолчанию:
/Users/<user>/Downloads/javafx-sdk-11/lib/
. Как только вы это сделаете, вы заметите, что классы JavaFX теперь распознаются в редакторе.Прежде чем запускать проект по умолчанию, вам просто нужно добавить их в параметры виртуальной машины:
--module-path /Users/<user>/Downloads/javafx-sdk-11/lib --add-modules=javafx.controls,javafx.fxml
Бежать
Maven
Если вы используете Maven для создания своего проекта, выполните следующие действия:
Добавьте зависимости JavaFX 11.
<dependencies> <dependency> <groupId>org.openjfx</groupId> <artifactId>javafx-controls</artifactId> <version>11</version> </dependency> <dependency> <groupId>org.openjfx</groupId> <artifactId>javafx-fxml</artifactId> <version>11</version> </dependency> </dependencies>
Как только вы это сделаете, вы заметите, что классы JavaFX теперь распознаются в редакторе.
Вы заметите, что Maven управляет необходимыми зависимостями для вас: он добавит javafx.base и javafx.graphics для javafx.controls, но, что наиболее важно, он добавит требуемый классификатор на основе вашей платформы. В моем случае Mac.
Вот почему ваши jar-
org.openjfx:javafx-controls:11
файлы пусты , потому что есть три возможных классификатора (платформы Windows, Linux и Mac), которые содержат все классы и встроенную реализацию.Если вы все еще хотите перейти в репозиторий .m2 и вручную взять оттуда зависимости, убедитесь, что вы выбрали правильный (например
.m2/repository/org/openjfx/javafx-controls/11/javafx-controls-11-mac.jar
)Замените плагины maven по умолчанию на те, что указаны здесь .
Беги
mvn compile javafx:run
, и должно работать.Подобное работает и для проектов Gradle, как подробно описано здесь .
РЕДАКТИРОВАТЬ
Упомянутое руководство по началу работы содержит обновленную документацию и примеры проектов для IntelliJ:
JavaFX 11 без Maven / Gradle, см. Немодульный образец или модульный образец проекта.
JavaFX 11 с Maven, см. Немодульный образец или модульный образец проекта.
JavaFX 11 с Gradle, см. Немодульный образец или модульный образец проекта.
источник
/Users/<user>/Downloads/javafx-sdk-11/lib/
, обратите внимание наlib
папку. Он должен содержать все javafx jar-файлыПроблема в том, что JavaFX больше не является частью JDK 11. Следующее решение работает с использованием IntelliJ (не пробовал с NetBeans):
Добавьте глобальную библиотеку JavaFX в качестве зависимости:
Настройки -> Структура проекта -> Модуль. В модуле перейдите на вкладку «Зависимости» и нажмите знак «+» -> Библиотека -> Java-> выберите JavaFX из списка и нажмите «Добавить выбранное», затем «Применить настройки».
Щелкните правой кнопкой мыши исходный файл (src) в вашем проекте JavaFX и создайте новый файл module-info.java . Внутри файла напишите следующий код:
module YourProjectName { requires javafx.fxml; requires javafx.controls; requires javafx.graphics; opens sample; }
Эти 2 шага решат все ваши проблемы с JavaFX, уверяю вас.
Ссылка: на канале Learn Programming есть учебное пособие по YouTube, в котором все детали описаны всего за 5 минут. Я также рекомендую посмотреть его, чтобы решить вашу проблему: https://www.youtube.com/watch?v=WtOgoomDewo
источник
У меня ничего из вышеперечисленного не сработало. Я потратил слишком много времени на устранение других возникших ошибок. Я обнаружил, что это самый простой и лучший способ.
Это работает для получения JavaFx на Jdk 11, 12 и OpenJdk12!
module thisIsTheNameOfYourProject { requires javafx.fxml; requires javafx.controls; requires javafx.graphics; opens sample; }
Все это заняло у меня всего 5 минут !!!
источник
Краткое резюме, вы можете сделать либо:
Включите модули JavaFX через
--module-path
и--add-modules
как в ответе Хосе.ИЛИ ЖЕ
После добавления в проект библиотек JavaFX (вручную или с помощью импорта maven / gradle) добавьте
module-info.java
файл, аналогичный тому, который указан в этом ответе. (Обратите внимание, что это решение делает ваше приложение модульным, поэтому, если вы используете другие библиотеки, вам также нужно будет добавить операторы, чтобы требовать их модули внутриmodule-info.java
файла).Этот ответ является дополнением к ответу Хосе.
Ситуация такая:
IllegalAccessError
При попытке запустить приложение вы получаете сообщение о «неназванном модуле».Выдержка для трассировки стека, генерирующей сообщение
IllegalAccessError
при попытке запустить приложение JavaFX из Intellij Idea:Exception in Application start method 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:567) at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:464) 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:567) at java.base/sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.java:1051) Caused by: java.lang.RuntimeException: Exception in Application start method at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:900) at javafx.graphics/com.sun.javafx.application.LauncherImpl.lambda$launchApplication$2(LauncherImpl.java:195) at java.base/java.lang.Thread.run(Thread.java:830) Caused by: java.lang.IllegalAccessError: class com.sun.javafx.fxml.FXMLLoaderHelper (in unnamed module @0x45069d0e) cannot access class com.sun.javafx.util.Utils (in module javafx.graphics) because module javafx.graphics does not export com.sun.javafx.util to unnamed module @0x45069d0e at com.sun.javafx.fxml.FXMLLoaderHelper.<clinit>(FXMLLoaderHelper.java:38) at javafx.fxml.FXMLLoader.<clinit>(FXMLLoader.java:2056) at org.jewelsea.demo.javafx.springboot.Main.start(Main.java:13) at javafx.graphics/com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$9(LauncherImpl.java:846) at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runAndWait$12(PlatformImpl.java:455) at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$10(PlatformImpl.java:428) at java.base/java.security.AccessController.doPrivileged(AccessController.java:391) at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$11(PlatformImpl.java:427) at javafx.graphics/com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:96) Exception running application org.jewelsea.demo.javafx.springboot.Main
Хорошо, теперь вы как бы застряли и не понимаете, что происходит.
На самом деле произошло следующее:
Так что вроде все должно быть ОК. НО, когда вы запускаете свое приложение, код в модулях JavaFX дает сбой при попытке использовать отражение для создания экземпляров вашего класса приложения (когда вы вызываете запуск) и ваших классов контроллера FXML (когда вы загружаете FXML). Без какой-либо помощи такое использование отражения в некоторых случаях может дать сбой, создавая неясные
IllegalAccessError
. Это связано с функцией безопасности системы модуля Java, которая не позволяет коду из других модулей использовать отражение в ваших классах, если вы явно не разрешите это (а средство запуска приложений JavaFX и FXMLLoader требуют отражения в своей текущей реализации, чтобы они функционировали правильно).Здесь приведены некоторые другие ответы на этот вопрос, относящиеся к
module-info.java
появляются .Итак, давайте пройдем ускоренный курс по модулям Java:
Ключевая часть такова:
Итак, возможно, вы не хотите открывать свой пакет для всего мира, тогда вы можете сделать:
Итак, вы создаете класс src / main / java / module-info.java, который выглядит так:
module org.jewelsea.demo.javafx.springboot { requires javafx.fxml; requires javafx.controls; requires javafx.graphics; opens org.jewelsea.demo.javafx.springboot to javafx.graphics,javafx.fxml; }
Где,
org.jewelsea.demo.javafx.springboot
- это имя пакета, который содержит класс приложения JavaFX и классы контроллера JavaFX (замените его на соответствующее имя пакета для вашего приложения). Это сообщает среде выполнения Java, что для классов вjavafx.graphics
иjavafx.fxml
можно вызывать отражение классов в вашемorg.jewelsea.demo.javafx.springboot
пакете. Как только это будет сделано, и приложение скомпилировано и повторно запущено, все будет работать нормально, иIllegalAccessError
отражение, сгенерированное JavaFX, больше не будет происходить.Но что, если вы не хотите создавать файл module-info.java
Если вместо использования кнопки «Выполнить» на верхней панели инструментов среды IDE для непосредственного запуска класса приложения вы:
javafx.run
.Run Maven Build
илиDebug...
.Тогда приложение будет работать без
module-info.java
файла. Я предполагаю, что это связано с тем, что плагин maven достаточно умен, чтобы динамически включать некоторые настройки, которые позволяют отражать приложение в классах JavaFX даже безmodule-info.java
файла, хотя я не знаю, как это достигается.Чтобы перенести этот параметр на кнопку «Выполнить» на верхней панели инструментов, щелкните правой кнопкой мыши
javafx.run
цель Maven и выберите параметрCreate Run/Debug Configuration
для цели. Затем вы можете просто выбрать «Выполнить» на верхней панели инструментов, чтобы выполнить цель Maven.источник