Код JavaFX работает в пакете «приложение», но не в других пакетах

Прежде всего, я работаю с 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

Поскольку этот вопрос, вероятно, будет актуальным в течение длительного времени, и учитывая, что каждые несколько месяцев выпускается новый JavaFX SDK, в котором говорится: самый последний javafx SDK неоднозначен. Я предлагаю вам отредактировать свой вопрос и опубликовать именно ту версию [JavaFX], которую вы используете. При этом судя по трассировке стека в вашем вопросе, похоже, вам нужно добавить exports zwischenuebungen; в ваш module-info.java файл.

Abra 21.04.2024 14:38

ИМХО: Просто избавьтесь от модульного приложения и создайте немодульное - все будет работать нормально. На всякий случай: вам понравился пример немодульного шаблонного приложения здесь: github.com/davidweber411/javafx-JavaFxAppMavenNonModular

David Weber 22.04.2024 07:19
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
2
70
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Опция: Модульная

Эта проблема связана с вашим 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), поскольку это дает вам более простые и простые в использовании варианты упаковки.

Ссылка

Другие вопросы по теме