JavaFX 11 разделен на семь модулей . В командной строке у вас есть:
--add-modules javafx.controls,javafx.graphics
И ошибка, которую вы получаете:
java.lang.IllegalAccessError: class com.sun.media.jfxmediaimpl.NativeMediaManager (in unnamed module @0x4d7be377) cannot access class com.sun.glass.utils.NativeLibLoader (in module javafx.graphics) because module javafx.graphics does not export com.sun.glass.utils to unnamed module @0x4d7be377
Сообщается, что класс в пакете com.sun.media.jfxmediaimpl
находится в неназванном модуле и пытается получить доступ к внутренним членам модуля javafx.graphics
. Название пакета означает, что он принадлежит модулю javafx.media
. Однако ошибка указывает на то, что вы используете модуль javafx.media
из classpath. Вам нужно включить javafx.media
в команду --add-modules
, чтобы использовать ее из пути модуля:
--add-modules javafx.controls,javafx.graphics,javafx.media
Это работает из-за module-info
файла javafx.graphics
. Он имеет квалифицированную директиву (ы) exports
и / или opens
, которая позволяет javafx.media
получать доступ к этим внутренним пакетам. Но система модулей может принимать во внимание эти директивы только в том случае, если все задействованное находится на пути модуля.
В связанной заметке вам не нужно включать javafx.graphics
в команду, так как вы уже добавляете javafx.controls
. И для javafx.controls
, и для javafx.media
требуются модули javafx.graphics
и javafx.base
, и поэтому они будут вытягиваться.
Когда или если вы сделаете свой код модульным, вам не придется иметь дело с --add-modules
. Вам просто нужно объявить соответствующие директивы requires
:
module example {
requires javafx.controls; // transitively requires javafx.base and javafx.graphics
requires javafx.media; // transitively requires javafx.base and javafx.graphics
// ... other directives ...
/*
* Don't forget to "exports" the package containing your Application
* class to at least the javafx.graphics module.
*/
}
Тогда вам просто нужно убедиться, что все модули, включая ваш, находятся на --module-path
(или -p
). Ваш модуль установит необходимые зависимости.
java -p <other-modules>;<javafx-modules>;<your-module> -m <your-module>/<main-class>