当前位置: 首页 > 知识库问答 >
问题:

运行JavaFx媒体应用程序时出现模块错误

汪成仁
2023-03-14

当我使用以下命令运行JavaFX11应用程序时:

/usr/lib/jvm/java-11-openjdk-amd64/bin/java 
-p ~/.m2/repository/org/openjfx/javafx-swing/11/javafx-swing-11.jar:
~/.m2/repository/org/openjfx/javafx-swing/11/javafx-swing-11-linux.jar:
~/.m2/repository/org/openjfx/javafx-graphics/11/javafx-graphics-11.jar:
~/.m2/repository/org/openjfx/javafx-graphics/11/javafx-graphics-11-linux.jar:
~/.m2/repository/org/openjfx/javafx-base/11/javafx-base-11.jar:
~/.m2/repository/org/openjfx/javafx-base/11/javafx-base-11-linux.jar:
~/.m2/repository/org/openjfx/javafx-controls/11/javafx-controls-11.jar:
~/.m2/repository/org/openjfx/javafx-controls/11/javafx-controls-11-linux.jar:
~/.m2/repository/org/openjfx/javafx-media/11/javafx-media-11.jar:
~/.m2/repository/org/openjfx/javafx-media/11/javafx-media-11-linux.jar 
--add-modules javafx.controls,javafx.graphics
-classpath ~/development/intellij/OpenPatrician/OpenPatricianStandalone/target/classes:
~/.OpenPatrician/plugins/maps/MinimalMap-Plugin.jar:
~/development/intellij/OpenPatrician/OpenPatricianDisplay/target/classes:
~/.m2/repository/ch/sahits/sahitsUtil/1.2.4/sahitsUtil-1.2.4.jar:
~/.m2/repository/junit/junit/4.12/junit-4.12.jar:
~/.m2/repository/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3.jar:
~/.m2/repository/org/springframework/boot/spring-boot-starter-log4j2/2.1.0.RELEASE/spring-boot-starter-log4j2-2.1.0.RELEASE.jar:
~/.m2/repository/org/apache/logging/log4j/log4j-slf4j-impl/2.11.1/log4j-slf4j-impl-2.11.1.jar:
~/.m2/repository/org/slf4j/slf4j-api/1.7.25/slf4j-api-1.7.25.jar:
~/.m2/repository/org/apache/logging/log4j/log4j-api/2.11.1/log4j-api-2.11.1.jar:
~/.m2/repository/org/apache/logging/log4j/log4j-core/2.11.1/log4j-core-2.11.1.jar:
~/.m2/repository/org/apache/logging/log4j/log4j-jul/2.11.1/log4j-jul-2.11.1.jar:
~/.m2/repository/org/slf4j/jul-to-slf4j/1.7.25/jul-to-slf4j-1.7.25.jar:
~/.m2/repository/commons-cli/commons-cli/1.4/commons-cli-1.4.jar:
~/development/intellij/OpenPatrician/OpenPatricianImage/target/classes:
~/development/intellij/OpenPatrician/OpenPatricianModel/target/classes:
~/development/intellij/OpenPatrician/GameEvent/target/classes:
~/.m2/repository/org/glassfish/jaxb/jaxb-runtime/2.3.1/jaxb-runtime-2.3.1.jar:
~/.m2/repository/org/glassfish/jaxb/txw2/2.3.1/txw2-2.3.1.jar:
~/.m2/repository/com/sun/istack/istack-commons-runtime/3.0.7/istack-commons-runtime-3.0.7.jar:
~/.m2/repository/org/jvnet/staxex/stax-ex/1.8/stax-ex-1.8.jar:
~/.m2/repository/com/sun/xml/fastinfoset/FastInfoset/1.2.15/FastInfoset-1.2.15.jar:
~/.m2/repository/javax/activation/javax.activation-api/1.2.0/javax.activation-api-1.2.0.jar:
~/.m2/repository/org/openjfx/javafx-swing/11/javafx-swing-11.jar:
~/.m2/repository/org/openjfx/javafx-swing/11/javafx-swing-11-linux.jar:
~/.m2/repository/org/openjfx/javafx-graphics/11/javafx-graphics-11.jar:
~/.m2/repository/org/openjfx/javafx-graphics/11/javafx-graphics-11-linux.jar:
~/.m2/repository/org/openjfx/javafx-base/11/javafx-base-11.jar:
~/.m2/repository/org/openjfx/javafx-base/11/javafx-base-11-linux.jar:
~/development/intellij/OpenPatrician/OpenPatricianSound/target/classes:
~/development/intellij/OpenPatrician/OpenPatricianUtilities/target/classes:
~/.m2/repository/org/springframework/spring-beans/5.1.2.RELEASE/spring-beans-5.1.2.RELEASE.jar:
~/.m2/repository/org/openjfx/javafx-controls/11/javafx-controls-11.jar:
~/.m2/repository/org/openjfx/javafx-controls/11/javafx-controls-11-linux.jar:
~/.m2/repository/commons-io/commons-io/2.6/commons-io-2.6.jar:
~/.m2/repository/com/thoughtworks/xstream/xstream/1.4.10/xstream-1.4.10.jar:
~/.m2/repository/xmlpull/xmlpull/1.1.3.1/xmlpull-1.1.3.1.jar:
~/.m2/repository/xpp3/xpp3_min/1.1.4c/xpp3_min-1.1.4c.jar:
~/.m2/repository/javax/xml/bind/jaxb-api/2.3.1/jaxb-api-2.3.1.jar:
~/.m2/repository/javax/annotation/javax.annotation-api/1.3.2/javax.annotation-api-1.3.2.jar:
~/.m2/repository/org/openjfx/javafx-media/11/javafx-media-11.jar:
~/.m2/repository/org/openjfx/javafx-media/11/javafx-media-11-linux.jar:
~/.m2/repository/org/springframework/spring-context/5.1.2.RELEASE/spring-context-5.1.2.RELEASE.jar:
~/.m2/repository/org/springframework/spring-aop/5.1.2.RELEASE/spring-aop-5.1.2.RELEASE.jar:
~/.m2/repository/org/springframework/spring-expression/5.1.2.RELEASE/spring-expression-5.1.2.RELEASE.jar:
~/.m2/repository/org/springframework/spring-oxm/5.1.2.RELEASE/spring-oxm-5.1.2.RELEASE.jar:
~/.m2/repository/com/google/guava/guava/24.1-jre/guava-24.1-jre.jar:
~/.m2/repository/com/google/code/findbugs/jsr305/1.3.9/jsr305-1.3.9.jar:
~/.m2/repository/org/checkerframework/checker-compat-qual/2.0.0/checker-compat-qual-2.0.0.jar:
~/.m2/repository/com/google/errorprone/error_prone_annotations/2.1.3/error_prone_annotations-2.1.3.jar:
~/.m2/repository/com/google/j2objc/j2objc-annotations/1.1/j2objc-annotations-1.1.jar:
~/.m2/repository/org/codehaus/mojo/animal-sniffer-annotations/1.14/animal-sniffer-annotations-1.14.jar:
~/development/intellij/OpenPatrician/OpenPatricianJavaFX/target/classes:
~/development/intellij/OpenPatrician/OpenPatricianGameEvent/target/classes:
~/development/intellij/OpenPatrician/OpenPatricianClientServerInterface/target/classes:
~/.m2/repository/org/springframework/boot/spring-boot-starter-aop/2.1.0.RELEASE/spring-boot-starter-aop-2.1.0.RELEASE.jar:
~/.m2/repository/org/springframework/boot/spring-boot-starter/2.1.0.RELEASE/spring-boot-starter-2.1.0.RELEASE.jar:
~/.m2/repository/org/yaml/snakeyaml/1.23/snakeyaml-1.23.jar:
~/.m2/repository/org/aspectj/aspectjweaver/1.9.2/aspectjweaver-1.9.2.jar:
~/development/intellij/OpenPatrician/OpenPatricianServer/target/classes:
~/development/intellij/OpenPatrician/OpenPatricianEngine/target/classes:
~/.m2/repository/com/carrotsearch/hppc/0.7.2/hppc-0.7.2.jar:
~/.m2/repository/org/springframework/spring-core/5.1.2.RELEASE/spring-core-5.1.2.RELEASE.jar:
~/.m2/repository/org/springframework/spring-jcl/5.1.2.RELEASE/spring-jcl-5.1.2.RELEASE.jar:
~/.m2/repository/org/reflections/reflections/0.9.11/reflections-0.9.11.jar:
~/.m2/repository/org/javassist/javassist/3.21.0-GA/javassist-3.21.0-GA.jar:
~/development/intellij/OpenPatrician/OpenPatricianData/target/classes:
~/.m2/repository/org/projectlombok/lombok/1.18.2/lombok-1.18.2.jar:
~/.m2/repository/org/springframework/boot/spring-boot-devtools/2.1.0.RELEASE/spring-boot-devtools-2.1.0.RELEASE.jar:
~/.m2/repository/org/springframework/boot/spring-boot/2.1.0.RELEASE/spring-boot-2.1.0.RELEASE.jar:
~/.m2/repository/org/springframework/boot/spring-boot-autoconfigure/2.1.0.RELEASE/spring-boot-autoconfigure-2.1.0.RELEASE.jar 
ch.sahits.game.openpatrician.standalone.OpenPatricianApplication

遇到以下错误:

Exception in thread "JavaFX Application Thread" 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
    at com.sun.media.jfxmediaimpl.NativeMediaManager.lambda$new$0(NativeMediaManager.java:136)
    at java.base/java.security.AccessController.doPrivileged(Native Method)
    at com.sun.media.jfxmediaimpl.NativeMediaManager.<init>(NativeMediaManager.java:107)
    at com.sun.media.jfxmediaimpl.NativeMediaManager$NativeMediaManagerInitializer.<clinit>(NativeMediaManager.java:78)
    at com.sun.media.jfxmediaimpl.NativeMediaManager.getDefaultInstance(NativeMediaManager.java:90)
    at com.sun.media.jfxmedia.MediaManager.canPlayProtocol(MediaManager.java:78)
    at com.sun.media.jfxmedia.locator.Locator.<init>(Locator.java:239)
    at com.sun.media.jfxmediaimpl.NativeMediaAudioClip.<init>(NativeMediaAudioClip.java:53)
    at com.sun.media.jfxmediaimpl.NativeMediaAudioClip.load(NativeMediaAudioClip.java:63)
    at com.sun.media.jfxmediaimpl.AudioClipProvider.load(AudioClipProvider.java:66)
    at com.sun.media.jfxmedia.AudioClip.load(AudioClip.java:135)
    at javafx.scene.media.AudioClip.<init>(AudioClip.java:83)
    at ch.sahits.game.openpatrician.sound.impl.LoopTrack.lambda$new$0(LoopTrack.java:26)
    at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$10(PlatformImpl.java:428)
    at java.base/java.security.AccessController.doPrivileged(Native Method)
    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)
    at javafx.graphics/com.sun.glass.ui.gtk.GtkApplication._runLoop(Native Method)
    at javafx.graphics/com.sun.glass.ui.gtk.GtkApplication.lambda$runLoop$11(GtkApplication.java:277)
    at java.base/java.lang.Thread.run(Thread.java:834)

根据我的理解,这个异常是我的模块设置有问题,但我不清楚需要更改什么:

  • 添加其他模块--add-modules以及哪些?
  • 添加--add-opens到模块使用的命令
  • 完全不同的东西?

共有1个答案

崔绍辉
2023-03-14

TL;DR:您需要确保javafx.media从module-path解析为一个模块。您可以通过以下两种方法执行此操作:

  1. 包括在VM参数中:--add-modules javafx.controls,javafx.media
  2. 或者使自己的代码模块化,向模块描述符添加适当的需要javafx.media;指令,并使用--module启动应用程序。

如果不确定在IDE和/或构建工具中如何或在何处设置VM参数,请查看JavaFX入门。

该错误与Java平台模块系统有关,在Java 9号中添加。如果你不知道什么是模块以及它们是如何工作的,请访问这个博客:了解Java 9模块。这里有一小段节选:

模块化在包之上增加了更高级别的聚合。关键的新语言元素是模块--一个唯一命名的、可重用的相关包组,以及资源(如图像和XML文件)和一个模块描述符,该描述符指定

  • 模块名称
  • 模块的依赖项(即此模块依赖的其他模块)
  • 它使其他模块显式可用的包(模块中的所有其他包对其他模块隐式不可用)
  • 它提供的服务
  • 它所使用的服务
  • 它允许反射到哪些其他模块

随着模块的引入,JavaFX也被模块化了。它现在由七个模块组成,从它的Javadoc可以看出。这些模块在它们之间共享一些内部功能,但不与应用程序开发人员共享。这是通过限定的导出/打开指令来完成的。

这是您的错误:

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

它告诉您,未命名模块中的类正在尝试访问另一个已命名模块中的类:javafx.graphics。但是,后一个模块至少不将所需的包导出到未命名的模块。查看错误消息和给定的类名,我们可以推断出未命名模块中的类是JavaFX的媒体实现的一部分。这建议类应该在javafx.media模块中。那么为什么错误会提到未命名的模块呢?

未命名模块是类路径上所有类都属于的模块。这意味着javafx.media模块被放在class-path上,并且失去了它的标识。这样做的一个结果是,由javafx.graphics模块声明的所有合格的导出/打开指令(这些指令授予javafx.media模块必要的访问权限)不再适用--因此,IllegalAccessErr

从您在问题中提供的命令行中,我们可以看到javafx-media-11.jar文件放在module-path(-p)上。那么问题出在哪里呢?该问题是由于将媒体JAR文件放置在module-path和class-path上,同时无法确保javafx.media模块作为一个模块来解决而引起的。

模块解析的算法由java.lang.module包文档描述。基本上,它从一组根模块开始,然后递归枚举requires指令。根模块由--add-module--module参数确定。您的代码不是模块化的,这意味着您没有使用--module,您有:

--add-modules javafx.controls,javafx.graphics

换句话说,没有一个根模块直接或间接地需要javafx.media模块,因此它永远不会被解析。由于类也在类路径上,所以仍然可以找到它们,但现在是在未命名的模块中。如果您没有将JavaFX依赖关系也放置在类路径上,那么您将得到ClassNotFoundException

解决方案很简单:确保javafx.media模块被解析。至少有两种方法可以实现这一点:

>

  • --add-modules参数中包含模块。

    --add-modules javafx.controls,javafx.media
    

    注意,您不需要指定javafx.graphics模块,因为它将被其他模块隐式地引入;javafx.controlsjavafx.media都需要javafx.graphics。在本例中,同样的一般推理也适用于javafx.base模块。

    JavaFX入门指南展示了如何在每个主要IDE(即IntelliJ、Eclipse和NetBeans)和构建工具(即Maven和Gradle)中为JavaFX配置VM选项。

    使您自己的代码模块化并添加必要的requires指令。

    module app {
        requires javafx.controls;
        requires javafx.media;
    
        // replace with your Application class' package
        exports com.example.app to javafx.graphics;
    }
    

    然后确保使用--module启动应用程序。

    请注意对javafx.graphics的限定导出。这是JavaFX反射性地实例化应用程序类所必需的。对于需要私有反射访问的FXML控制器和其他API也有类似的要求(限定的opens)。

    还有另一种选择:将所有内容都放在类路径上,包括JavaFX模块,而完全忽略JPMS模块。如果这样做,则主类不能是application的子类。您必须创建一个单独的launcher类来简单地启动JavaFX。警告:不支持此方法。

  •  类似资料:
    • > 我开发了一个javaFx应用程序,并在Mac的com.zenjava maven插件的帮助下创建了该应用程序的中间包。 bundle是用JDK:1.7.0_40.jdk创建的

    • 这是我第一次使用Javafx与Spring Boot我有以下错误时运行我的应用程序 主课 } 控制器类 } pom.xml http://maven.apache.org/xsd/maven-4.0.0.xsd" 拜托这是怎么回事。为什么org.springframework.boot:sping-boo-maven-plugin:2.0.0。释放:运行不能被执行? 场景fxml代码 我正在用Ne

    • Spark-submit--class MyClass-master yar--deploy-mode cluster--executor-memory 1g--executor-cores 2 hdfs://url:port/my.jar 这个应用程序,接收来自kinesis流的传入数据,并基于它执行一个请求(回发)到一个我可以跟踪的url。我已经在本地测试了我的应用程序,运行它设置SparkC

    • 在运行简单的GWT应用程序时获取错误。当我用ant通过命令行运行时,它工作得很好,但在IntelliJ中导入后,我得到了这个错误。不知道为什么我会得到这个错误:

    • 我从我的朋友那里收到了一个Java Web程序,我试图运行并理解代码,但我似乎无法运行它,以下是Apache日志中的错误消息 03-JUL-2014 20:33:51.873严重的[http-nio-8084-exec-29]org.apache.catalina.core.standardWrapperValve.invoke servlet.Service()在路径[/]上下文中的servle

    • 我是一名新来者,希望通过我的编辑器运行springboot项目,但我在池初始化期间不断收到一个错误