Прежде всего, я работаю с eclipse 2024-03 и самой последней версией javafx SDK.
У меня есть код javaFX, который работает, когда он находится в пакете приложения, который создается автоматически при создании нового проекта javafx. Но когда я создаю новый пакет в том же проекте и пытаюсь запустить тот же код, я получаю следующую ошибку:
Произошла ошибка во время инициализации загрузочного уровня. java.lang.module.FindException: Модуль javafx. не найдено
Может ли кто-нибудь сказать мне, какие настройки мне нужно изменить для этого конкретного пакета?
Обновлено: после повторной попытки я получаю следующие ошибки:
Exception in Application constructor
Exception in thread "main" java.lang.reflect.InvocationTargetException
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:568)
at java.base/sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.java:1085)
Caused by: java.lang.RuntimeException: Unable to construct Application instance: class zwischenuebungen.LayoutContainer
at [email protected]/com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:883)
at [email protected]/com.sun.javafx.application.LauncherImpl.lambda$launchApplication$2(LauncherImpl.java:196)
at java.base/java.lang.Thread.run(Thread.java:840)
Caused by: java.lang.IllegalAccessException: class com.sun.javafx.application.LauncherImpl (in module javafx.graphics) cannot access class zwischenuebungen.LayoutContainer (in module Test1) because module Test1 does not export zwischenuebungen to module javafx.graphics
at java.base/jdk.internal.reflect.Reflection.newIllegalAccessException(Reflection.java:392)
at java.base/java.lang.reflect.AccessibleObject.checkAccess(AccessibleObject.java:674)
at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:489)
at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:480)
at [email protected]/com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$8(LauncherImpl.java:795)
at [email protected]/com.sun.javafx.application.PlatformImpl.lambda$runAndWait$12(PlatformImpl.java:483)
at [email protected]/com.sun.javafx.application.PlatformImpl.lambda$runLater$10(PlatformImpl.java:456)
at java.base/java.security.AccessController.doPrivileged(AccessController.java:399)
at [email protected]/com.sun.javafx.application.PlatformImpl.lambda$runLater$11(PlatformImpl.java:455)
at [email protected]/com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)
at [email protected]/com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
at [email protected]/com.sun.glass.ui.win.WinApplication.lambda$runLoop$3(WinApplication.java:184)
... 1 more
ИМХО: Просто избавьтесь от модульного приложения и создайте немодульное - все будет работать нормально. На всякий случай: вам понравился пример немодульного шаблонного приложения здесь: github.com/davidweber411/javafx-JavaFxAppMavenNonModular




Эта проблема связана с вашим module-info.java.
Вероятно, там есть строка exports <somepackagename>, где <somepackagename> нет zwischenuebungen, обозначающего пакет, который вы пытаетесь использовать.
Вам понадобится либо export, либо open пакет для вашего приложения.
В сообщении об ошибке указано, какой пакет вам нужно открыть и какой модуль вам нужно открыть:
module Test1 does not export zwischenuebungen to module javafx.graphics
Итак, минимальный module-info.java (вам могут понадобиться дополнительные операторы для вашего реального приложения):
module Test1 {
requires javafx.controls;
exports zwischenuebungen;
}
Это обеспечивает полную видимость пакета zwischenuebungen для других модулей.
Или просто откройте javafx.graphics:
module Test1 {
requires javafx.controls;
opens zwischenuebungen to javafx.graphics;
}
Это ограничивает видимость именованного модуля.
Причина, по которой это требуется, заключается в том, что модуль javafx.graphics использует отражение для создания экземпляра и запуска вашего приложения JavaFX, и для этого требуется, чтобы пакет, содержащий приложение, открыл модуль javafx.graphics для работы.
Это упоминается в Javadoc Приложение:
Развертывание приложения как модуля
Если подкласс Application находится в именованном модуле, то этот класс должен быть доступным для модуля
javafx.graphics. В противном случае исключение будет выброшено при запуске приложения. Это означает, что в Помимо того, что сам класс объявлен общедоступным, модуль должен экспортируйте (или откройте) содержащий пакет как минимумjavafx.graphicsмодуль.Например, если
com.foo.MyApplicationнаходится в модулеfoo.app,module-info.javaможет выглядеть так:module foo.app { exports com.foo to javafx.graphics; }
Другой вариант, как упоминалось в комментариях, — сделать ваше приложение немодульным.
Инструкции по этому поводу находятся на сайте openjfx.io (я не буду повторять или комментировать их здесь).
Предположим, это сложное приложение с множеством сторонних зависимостей. В этом случае немодульная структура может быть подходящим вариантом. Но для простого приложения с минимальными зависимостями только от JRE и JavaFX, вероятно, лучше всего использовать модуль (IMO), поскольку это дает вам более простые и простые в использовании варианты упаковки.
Поскольку этот вопрос, вероятно, будет актуальным в течение длительного времени, и учитывая, что каждые несколько месяцев выпускается новый JavaFX SDK, в котором говорится: самый последний javafx SDK неоднозначен. Я предлагаю вам отредактировать свой вопрос и опубликовать именно ту версию [JavaFX], которую вы используете. При этом судя по трассировке стека в вашем вопросе, похоже, вам нужно добавить
exports zwischenuebungen;в вашmodule-info.javaфайл.