JavaFX项目MP4视频在IDE中运行正常,导出可运行Jar后无法播放
问题根因
- 你当前代码使用
File类读取本地路径src/RickRoll.mp4,Eclipse运行时项目目录下确实存在该路径的文件,因此可以正常加载。但导出为可运行Jar包后,所有资源都被打包在Jar压缩包内部,文件系统中不存在独立的src/RickRoll.mp4路径,因此File类无法读取到目标资源。 - 你注释掉的
getResource写法才是正确读取Jar包内资源的方案,getResource通过类加载器读取类路径下的资源,无论资源是在本地项目目录还是在Jar包内都可以正常识别。
修复步骤
- 先确认资源打包配置:导出Jar时确保
RickRoll.mp4、60AKG.png都被打包进Jar的类路径中,Eclipse默认会将src目录下的非Java文件一并打包,如果你没有修改过导出配置无需额外调整。 - 替换资源加载逻辑:删除基于
File的资源读取代码,放开注释的getResource逻辑,同时图标加载逻辑也要同步修改,避免Jar运行时图标无法显示。
修正后代码
public void playRickRoll() throws MalformedURLException { StackPane spRickRoll = new StackPane(); Stage stage = new Stage(); stage.setResizable(false); // 图标也改用getResource加载 stage.getIcons().add(new Image(getClass().getResource("/60AKG.png").toString())); URL videoURL = getClass().getResource("/RickRoll.mp4"); Media media = new Media(videoURL.toString()); MediaPlayer mediaPlayer = new MediaPlayer(media); mediaPlayer.setAutoPlay(true); MediaView mediaView = new MediaView(); mediaView.setMediaPlayer(mediaPlayer); spRickRoll.getChildren().add(mediaView); stage.setScene(new Scene(spRickRoll, 460, 360)); stage.show(); mediaPlayer.play(); stage.setOnCloseRequest(new EventHandler<WindowEvent>() { @Override public void handle(WindowEvent arg0) { mediaPlayer.stop(); } }); }
注意:如果你的资源文件放在和当前类同包的目录下,getResource的参数去掉开头的
/即可;如果放在src根目录,保留开头的/代表从类路径根目录查找资源。
额外注意事项
- 永远不要用
File类读取Jar包内的资源,File只能识别文件系统中独立存在的文件,无法读取Jar压缩包内部的资源条目。 - 所有项目内的静态资源都应该通过类加载器的
getResource、getResourceAsStream系列方法加载,保证开发和打包后运行逻辑一致。
内容的提问来源于stack exchange,提问作者itay bielski
相关产品推荐
相关产品推荐

