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

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


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


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


这里有一个例子,对我来说,已经触发了这种行为:


// 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();

    }

}

感谢您的帮助!


30秒到达战场
浏览 162回答 2
2回答

慕田峪9158850

JavaFx 被移除到 JDK> = 11 中,现在是一个单独的项目 opensurse [openjfx] ( https://openjfx.io/ )。现在创建一个可在任何地方运行的应用程序 javafx 版本变得更加困难,但它是一个不断发展的过程,我认为这是很好的文档 [doc-image-live] ( https://openjfx.io/ openjfx-docs/#modular)。我在开发 JDK 1.8 时遇到了类似的问题,但在我的版本 java 系统中是 openjdk11,我认为这是相同的情况。您的示例是错误的,因为它不是 JavaFX 应用程序。JavaFX 应用程序必须扩展javafx.application.Application并在主调用方法launch ,该方法将调用从 Application 继承的方法start 。这是 Oracle 的一个简单示例public class HelloWorld extends Application {&nbsp; &nbsp; public static void main(String[] args) {&nbsp; &nbsp; &nbsp; &nbsp; launch(args);&nbsp; &nbsp; }&nbsp; &nbsp; @Override&nbsp; &nbsp; public void start(Stage primaryStage) {&nbsp; &nbsp; &nbsp; &nbsp; primaryStage.setTitle("Hello World!");&nbsp; &nbsp; &nbsp; &nbsp; Button btn = new Button();&nbsp; &nbsp; &nbsp; &nbsp; btn.setText("Say 'Hello World'");&nbsp; &nbsp; &nbsp; &nbsp; btn.setOnAction(new EventHandler<ActionEvent>() {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; @Override&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; public void handle(ActionEvent event) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; System.out.println("Hello World!");&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; });&nbsp; &nbsp; &nbsp; &nbsp; StackPane root = new StackPane();&nbsp; &nbsp; &nbsp; &nbsp; root.getChildren().add(btn);&nbsp; &nbsp; &nbsp; &nbsp; primaryStage.setScene(new Scene(root, 300, 250));&nbsp; &nbsp; &nbsp; &nbsp; primaryStage.show();&nbsp; &nbsp; }}ps:说javafx的时候一定要加上java版本,因为我们不知道你的java版本

Qyouu

如果您不想使用 JavaFX,另一种方法是使用源自 JavaZOOM 的库来完成读取 mp3 文件的任务。我在 github 上看到许多源自此来源的产品,例如https://github.com/goxr3plus/java-sound-libraries但我自己并没有使用过这个特定的库。我的偏好是将用于 GUI 的 JavaFX 与 javax.audio.sampled 以及我构建的依赖于 java.sound.sampled.SourceDataLine 输出的库相结合。但我从来没有费心去实施阅读 mp3。在使用压缩音频资源时,我倾向于采用 ogg/vorbis 路线。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java