FXGL: NoClassDefFoundError при вызове FXGL.play ("drop.wav") - PullRequest
0 голосов
/ 08 июля 2019

Я пытаюсь следовать второму руководству https://github.com/AlmasB/FXGL/wiki/Adding-Images-and-Sounds-%28FXGL-11%29, и кажется, что я получаю ошибку при запуске приложения. Я использую Gradle Run или запустить его в затмении, без звука все работает отлично.

Структура моего проекта выглядит следующим образом:

enter image description here

Я использую openJDK 11.0.3 и linux mint 19.1 64-bit.

Это в основном та же программа, что и в руководстве, я получаю следующее исключение:

Сообщение: javafx / scene / media / AudioClip Тип: NoClassDefFoundError

Метод: DesktopAudioService.loadAudioImpl () Строка:

DesktopAudioService.kt: 28

Мой build.gradle довольно прост, я думаю; инициализация gradle и зависимости:

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» на моей клавиатуре без сбоя программы. Я также надеюсь на некоторое объяснение фона, что вызывает ошибку.

Ответы [ 2 ]

1 голос
/ 08 июля 2019

Вы используете плагин JavaFX Gradle и настраиваете модули в своей сборке следующим образом:

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

Это означает, что плагин добавит в ваш проект javafx.base, javafx.graphics и javafx.controlsмодули, с версией и правильным классификатором, основанным на вашей платформе.

Если вы проверите свои внешние библиотеки, вы не найдете никаких других модулей JavaFX реализация , но вы можете найти «пустой»"модули, которые использует FXGL:

image

Так что Base, Graphics и Controls используют классификатор Mac (в моем случае) и версию, которую я установил (12.0.1)в то время как другие модули (FXML, Media и Swing) являются пустыми модулями, добавленными из FXGL (см., например, Медиа зависимость ).

Когда вы запускаете свой проектклассы Media отсутствуют, поэтому при попытке воспроизведения звука вы получаете сообщение об исключении:

Произошло фатальное исключение: 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: Asset247) 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'.

0 голосов
/ 08 июля 2019

Если вы используете OpenJDK, то JavaFx может быть недоступен. Это будет причиной для исключения. Измените на Oracle JDK, если вы используете Windows. В Linux есть другие способы с самим OpenJDK.

Обратитесь к этому сообщению JavaFX и OpenJDK за некоторыми подробностями о том, как это сделать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...