Важной частью этой трассировки стека является последняя Caused by:
, которая:
Caused by: java.lang.IllegalAccessError: superclass access check failed: class com.sun.javafx.embed.swing.SwingNodeHelper (in unnamed module @0x412b4fb) cannot access class com.sun.javafx.scene.NodeHelper (in module javafx.graphics) because module javafx.graphics does not export com.sun.javafx.scene to unnamed module @0x412b4fb
Это говорит о том, что в «неназванном модуле» есть класс с именем SwingNodeHelper
, который расширяет класс с именем NodeHelper
, присутствующий в модуле javafx.graphics
. Однако модуль javafx.graphics
не экспортирует этот суперкласс (точнее, пакет, к которому принадлежит суперкласс) в «неназванный модуль». Это приводит к IllegalAccessError
при попытке загрузить класс SwingNodeHelper
.
«Безымянный модуль» - это специальный Module
(по одному на ClassLoader
), который содержит классы на classpath . Классы SwingNode
и связанные SwingNodeHelper
являются частью модуля javafx.swing
. Эти знания в сочетании с данной ошибкой говорят нам, что модуль javafx.swing
используется из classpath , когда его необходимо использовать из modulepath . Исправление, как сказал Хосе Переда в комментарии , состоит в том, чтобы включить модуль javafx.swing
в вашу команду --add-modules
.
Причина, по которой это работает, заключается в том, что javafx.graphics
modules делает экспорт необходимого пакета в модуль javafx.swing
- но все должно быть в modulepath , чтобы работать должным образом.
Когда или если вы делаете свой код модульным, вы можете отказаться от команды --add-modules
и просто перечислить соответствующие директивы requires
в своем файле module-info.java
.
module <your-module-name> {
requires javafx.swing;
// other directives...
}
Похожие вопросы: