使用JavaFX从jar播放声音时出现java.lang.NoClassDefFoundError

时间:2019-07-02 08:27:53

标签: java javafx audio compilation runnable-jar

我希望能够播放mp3文件中的声音,为此我看到了一些推荐使用JavaFX的帖子。我实现了MediaPlayer并初始化了JFXPanel,在eclipse中,一切正常。

但是,当我导出到可运行的jar并尝试运行该程序时,出现以下错误消息:java.lang.NoClassDefFoundError:javafx / scene / media / MediaException。

我认为这是由于在新的JRE版本中排除了JavaFX(我在搜索解决方案时遇到的)。我的主要问题是如何使用JavaFX运送罐子?我必须包括一个罐子吗?如果是,我从哪里得到它?因为如果我没记错的话,eclipse似乎并没有将JavaFX打包到我的runnable中。

对于我来说,这是一个已经触发此行为的示例:

// This would throw a java.lang.NoClassDefFoundError for the JFXPanel but is effectively the same problem
public class Test extends Application
{
    public static void main(String[] Args)
    {
        launch(Args);
    }

    @Override
    public void start(Stage primaryStage) {
        primaryStage.setTitle("Hello World!");
        StackPane root = new StackPane();

        primaryStage.setScene(new Scene(root, 300, 250));
        primaryStage.show();
    }
}

谢谢您的帮助!

2 个答案:

答案 0 :(得分:2)

JavaFx已移至JDK> = 11,现在是一个单独的项目opensurse [openjfx](https://openjfx.io/)。 现在要在任何地方创建可运行的应用程序javafx版本变得更加困难,但这是一个持续的发展,我认为这是很好的文档[doc-image-live](https://openjfx.io/openjfx-docs/#modular)。 / p>

当我用于开发JDK 1.8时,我遇到了类似的问题,但是在我的版本中,java系统是openjdk11,我认为情况是一样的。

您的示例是错误的,因为不是JavaFX应用程序。 JavaFX应用程序必须扩展 javafx.application.Application ,并在主调用方法 launch 中,该方法将调用从继承的方法 start 申请。

这是Oracle的简单示例

public class HelloWorld extends Application {
    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage primaryStage) {
        primaryStage.setTitle("Hello World!");
        Button btn = new Button();
        btn.setText("Say 'Hello World'");
        btn.setOnAction(new EventHandler<ActionEvent>() {

            @Override
            public void handle(ActionEvent event) {
                System.out.println("Hello World!");
            }
        });

        StackPane root = new StackPane();
        root.getChildren().add(btn);
        primaryStage.setScene(new Scene(root, 300, 250));
        primaryStage.show();
    }
}

ps:当您讲javafx时,必须添加Java版本,因为我们不知道您的Java版本

答案 1 :(得分:0)

如果您不想使用JavaFX,则另一种方法是利用源自JavaZOOM的库来读取mp3文件。我看到github上有许多源于此资源的产品,例如https://github.com/goxr3plus/java-sound-libraries,但我自己并未使用此特定的库。

我的首选是将GUI的JavaFX与javax.audio.sampled以及我构建的依赖于java.sound.sampled.SourceDataLine的库相结合。但是我从不费心去实现阅读mp3。使用压缩音频资源时,我倾向于采用ogg / vorbis路线。

相关问题