java.lang.NoClassDefFoundError 当使用 JavaFX 从 jar 播放声音时
java.lang.NoClassDefFoundError when using JavaFX for playing sound from jar
我希望能够播放 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();
}
}
感谢您的帮助!
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,此方法将调用方法 start继承自Application.
这是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 版本
如果您不想使用 JavaFX,另一种方法是使用源自 JavaZOOM 的库来完成读取 mp3 文件的任务。我在 github 上看到许多源自此来源的产品,例如 https://github.com/goxr3plus/java-sound-libraries 但我自己并没有使用过这个特定的库。
我的偏好是将用于 GUI 的 JavaFX 与 javax.audio.sampled 以及我构建的依赖于 java.sound.sampled.SourceDataLine 输出的库相结合。但我从来没有费心去实施阅读 mp3。在使用压缩音频资源时,我倾向于采取 ogg/vorbis 路线。
我希望能够播放 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();
}
}
感谢您的帮助!
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,此方法将调用方法 start继承自Application.
这是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 版本
如果您不想使用 JavaFX,另一种方法是使用源自 JavaZOOM 的库来完成读取 mp3 文件的任务。我在 github 上看到许多源自此来源的产品,例如 https://github.com/goxr3plus/java-sound-libraries 但我自己并没有使用过这个特定的库。
我的偏好是将用于 GUI 的 JavaFX 与 javax.audio.sampled 以及我构建的依赖于 java.sound.sampled.SourceDataLine 输出的库相结合。但我从来没有费心去实施阅读 mp3。在使用压缩音频资源时,我倾向于采取 ogg/vorbis 路线。