Java MediaException:从导出的JAR文件运行项目时,媒体\u不可用
这不是重复的,因为无法使用getResourceAsStream()初始化媒体对象。在文档中:“只支持HTTP、文件和JAR URI。” 当我从Eclipse运行JavaFX项目时,它可以完美地工作,但当我运行导出的可执行JAR时,它就会中断。我尝试过每种类型的库处理,但都不起作用。我正在使用JavaFX2.2和Eclipse Oxygen 2018年3月Java MediaException:从导出的JAR文件运行项目时,媒体\u不可用,java,javafx,executable-jar,Java,Javafx,Executable Jar,这不是重复的,因为无法使用getResourceAsStream()初始化媒体对象。在文档中:“只支持HTTP、文件和JAR URI。” 当我从Eclipse运行JavaFX项目时,它可以完美地工作,但当我运行导出的可执行JAR时,它就会中断。我尝试过每种类型的库处理,但都不起作用。我正在使用JavaFX2.2和Eclipse Oxygen 2018年3月 public static Media gameMusic; public static MediaPlayer gameMusicPlay
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)
MediaException:MEDIA\u不可用:/Users/username/Desktop/resources/data/music/Kevin\u MacLeod\u--\ u Ouroboros\u--\ u Full\u Mix.wav(无此类文件或目录)
在javafx.scene.media.media.(media.java:407)
at application.Main.start(Main.java:77)
在com.sun.javafx.application.launchempl.lambda$launchApplication1$162(launchempl.java:863)
位于com.sun.javafx.application.PlatformImpl.lambda$runAndWait$175(PlatformImpl.java:326)
位于com.sun.javafx.application.PlatformImpl.lambda$null$173(PlatformImpl.java:295)
位于java.security.AccessController.doPrivileged(本机方法)
位于com.sun.javafx.application.PlatformImpl.lambda$runLater$174(PlatformImpl.java:294)
位于com.sun.glass.ui.invokelateDispatcher$Future.run(invokelateDispatcher.java:95)
注意:当我修复文件路径的代码以包含可执行文件的名称时,Eclipse和可执行文件都会出现中断错误很简单,它说
MEDIA\u UNAVAILABLE
意味着您的项目无法从给定路径找到资源。这可能是由于相对路径的原因,您需要提供一个绝对路径来从系统中查找资源
你可以试试这样的
Media media = new Media(getHostServices().getDocumentBase() + "/com/projectName/resources/hello.mp3");
MediaPlayer player = new MediaPlayer(media);
编辑
从hostServices.getCodeBase()中:
如果应用程序未打包在jar文件中,此方法将返回空字符串
并确保您有适当的导入
,并使用应用程序
类扩展您的应用程序
import javafx.application.Application;
import javafx.application.HostServices;
public class App extends Application {
}
您需要知道存储资源的文件夹的绝对根目录,否则无法找到它们。Gradle提供了一个
应用程序
插件,该插件将创建一个Windows、Linux和Mac脚本,该脚本将当前目录作为其第一个参数传递。您还可以检查是否没有其他文件夹。所有这些都被导出到一个罐子中file@AndrewS刚看到你的便条,你试过reference
方法吗?您的资源是否放在同一个包目录中?当您部署JAR文件时,如何部署WAV文件?它们是否打包在JAR文件中?或者它们是与JAR文件一起复制的?如果您将WAV文件打包到JAR文件中,那么您需要执行以下操作:我按照您的建议执行了,但它引发了另一个错误:MediaException:MEDIA\u不可用:/Users/andrewsneed/Desktop/com/Escape/resources/data/music/Kevin_MacLeod_--u Ouroboros_--u Full_Mix.wav(没有这样的文件或目录)在javafx.scene.media.media.(media.java:407)在application.Main.start(Main.java:77)在com.sun.javafx.application.launchempl.lambda$launchApplication1$162(launchempl.java:863)在com.sun.javafx.application.PlatformImpl.lambda$runAndWait$175(PlatformImpl.java:326)
@AndrewS检查更新的答案。更新的答案没有帮助,导入的库从未使用过。还有其他想法吗?