You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaFX项目MP4视频在IDE中运行正常,导出可运行Jar后无法播放

问题根因
  • 你当前代码使用File类读取本地路径src/RickRoll.mp4,Eclipse运行时项目目录下确实存在该路径的文件,因此可以正常加载。但导出为可运行Jar包后,所有资源都被打包在Jar压缩包内部,文件系统中不存在独立的src/RickRoll.mp4路径,因此File类无法读取到目标资源。
  • 你注释掉的getResource写法才是正确读取Jar包内资源的方案,getResource通过类加载器读取类路径下的资源,无论资源是在本地项目目录还是在Jar包内都可以正常识别。
修复步骤
  1. 先确认资源打包配置:导出Jar时确保RickRoll.mp4、60AKG.png都被打包进Jar的类路径中,Eclipse默认会将src目录下的非Java文件一并打包,如果你没有修改过导出配置无需额外调整。
  2. 替换资源加载逻辑:删除基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 09:51:03