首页 > 解决方案 > MediaException:从导出的 JAR 文件运行项目时 MEDIA_UNAVAILABLE

问题描述

这不是重复的,因为无法使用 getResourceAsStream() 初始化 Media 对象。来自文档:“仅支持 HTTP、FILE 和 JAR URI。”

我的 JavaFX 项目在我从 Eclipse 运行时运行良好,但在我运行导出的可执行 JAR 时中断。我已经尝试过每种类型的库处理,但都没有奏效。我正在使用 JavaFX 2.2 和 2018 年 3 月的 Eclipse Oxygen。

public static Media gameMusic;
public static MediaPlayer gameMusicPlayer;
public static MediaView gameMusicMediaView;

// adds music, once for each audio file to be played
gameMusic = new Media(new File("resources/data/music/Kevin_MacLeod_-_Ouroboros_-_Full_Mix.wav").toURI().toString());
bulletSound = new AudioClip(new File("resources/data/music/Photon gun shot.wav").toURI().toString());
explosionSound = new AudioClip(new File("resources/data/music/Explosion+3.wav").toURI().toString());

目录结构:

+src
  -source files
+resources
  +data
    +music
      -music files
    +fxml
      -fxml files
    +other folders

错误输出:

MediaException: MEDIA_UNAVAILABLE : /Users/username/Desktop/resources/data/music/Kevin_MacLeod_-_Ouroboros_-_Full_Mix.wav (No such file or directory)
at javafx.scene.media.Media.<init>(Media.java:407)
at application.Main.start(Main.java:77)
at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$162(LauncherImpl.java:863)
at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$175(PlatformImpl.java:326)
at com.sun.javafx.application.PlatformImpl.lambda$null$173(PlatformImpl.java:295)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.javafx.application.PlatformImpl.lambda$runLater$174(PlatformImpl.java:294)
at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)

注意:当我修复文件路径的代码以包含可执行文件的名称时,它会在 Eclipse 和可执行文件中中断

标签: javajavafxexecutable-jar

解决方案


该错误非常简单,它表示MEDIA_UNAVAILABLE您的项目无法从给定路径中找到资源。可能是相对路径的原因,需要提供绝对路径才能从系统中查找资源。

你可以试试这样的

Media media = new Media(getHostServices().getDocumentBase() + "/com/projectName/resources/hello.mp3");
MediaPlayer player = new MediaPlayer(media);

编辑

从 hostServices.getCodeBase() javadoc

如果应用程序未打包在 jar 文件中,则此方法返回空字符串。

并确保你有适当的imports和扩展你的应用程序的Application

import javafx.application.Application;
import javafx.application.HostServices;

public class App extends Application {

}

推荐阅读