java - FXGL : NoClassDefFoundError when calling FXGL. 播放 ("drop.wav")

标签 java javafx

我正在尝试遵循第二个教程 https://github.com/AlmasB/FXGL/wiki/Adding-Images-and-Sounds-%28FXGL-11%29当我运行该应用程序时,似乎出现错误。我使用 gradle run 或在 eclipse 中运行它,没有声音一切正常。

我的项目结构如下所示:

enter image description here

我使用 openJDK 11.0.3 和 linux mint 19.1 64 位。

它与教程中的程序基本相同,但我得到以下异常:

Message: javafx/scene/media/AudioClip Type: NoClassDefFoundError

Method: DesktopAudioService.loadAudioImpl() Line:

DesktopAudioService.kt:28

我猜我的 build.gradle 非常简单; gradle init 和依赖项:

plugins {
    id 'application'
    id 'java-library'
    id 'org.openjfx.javafxplugin' version '0.0.7'
}

repositories {
    mavenCentral()
    jcenter()
}

dependencies {
    api 'org.apache.commons:commons-math3:3.6.1'

    implementation 'com.google.guava:guava:27.0.1-jre'

    // Use JUnit test framework
    testImplementation 'junit:junit:4.12'

    compile 'com.github.almasb:fxgl:11.1-beta'
}

javafx {
    version = "12"
    modules = [ 'javafx.controls' ]
}

mainClassName = 'game.idea.BasicGameApp'

我希望在单击键盘上的“f”时播放声音,而不会导致程序崩溃。我还希望得到一些导致错误的背景解释。

最佳答案

您使用 JavaFX Gradle 插件并在构建中设置模块,如下所示:

javafx {
    version = "12.0.1"
    modules = [ 'javafx.controls' ]
}

这意味着该插件将向您的项目添加 javafx.basejavafx.graphicsjavafx.controls 模块,其中包含基于您的平台的版本和正确的分类器。

如果您检查外部库,您将找不到任何其他 JavaFX 模块实现,但您可能会发现 FXGL 正在使用的“空”模块:

因此,Base、Graphics 和 Controls 使用 Mac 分类器(在我的例子中)和我设置的版本 (12.0.1),而其他模块(FXML、Media 和 Swing)为空 从 FXGL 添加的模块(例如 Media dependency )。

当您运行项目时,媒体类不存在,因此当您尝试播放声音时,您会收到报告的异常:

Fatal exception occurred: java.lang.NoClassDefFoundError : javafx/scene/media/AudioClip E: com.almasb.fxgl.audio.impl.DesktopAudioService.loadAudioImpl(DesktopAudioService.kt:28) E: com.almasb.fxgl.audio.impl.DefaultAudioService.loadAudio(DefaultAudioService.kt:29) E: com.almasb.fxgl.app.AssetLoader.loadSound(AssetLoader.kt:247) E: com.almasb.fxgl.dsl.FXGL$Companion.play(FXGL.kt:228) E: com.almasb.fxgl.dsl.FXGL.play(FXGL.kt) E: game.idea.BasicGameApp$5.onActionBegin(BasicGameApp.java:61)

解决方案非常简单:只需将缺少的模块添加到您的构建中即可:

javafx {
    version = "12.0.1"
    modules = [ 'javafx.controls', 'javafx.fxml', 'javafx.swing', 'javafx.media' ]
}

最后,顺便说一句,您可以使用'com.github.almasb:fxgl:11.3'

关于java - FXGL : NoClassDefFoundError when calling FXGL. 播放 ("drop.wav"),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56931096/

相关文章:

Java 8 流 : can you capture/reuse a value calculated in a filter?

java - 如何启用预定项目的下拉列表以添加到 SceneBuilder 中的自定义控件?

Linux 上的 Java - 打开文件管理器

java - 连接到多个 mongo 数据库主机并在 spring boot 中使用不同的数据库进行身份验证

Javafx GUI 卡住

java - 在 JavaFX 8 中重新对齐 AnchorPane 中的组件

java - 让 javaFX 11 应用程序在 docker 上运行

java - 变量应该设为 volatile 吗?

java - 从 Java 中的 Map 中删除 Class 对象键

java - PDFBox:如何在填充矩形的顶部绘制文本?