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

Eclipse中正常运行的Java程序,打包Jar后抛FileNotFoundException

解决Java打包Jar后资源文件找不到的问题

一、调整资源文件目录

把项目根目录下的/res文件夹移动到src目录内部。调整后项目结构如下:

你的项目名称/
├── src/
│   ├── main/
│   │   ├── Main.java
│   │   ├── MusicPlayer.java
│   └── res/
│       └── music.wav
└── .classpath、.project等Eclipse配置文件

这样Eclipse编译时会自动将res目录下的资源文件复制到classpath中,后续打包Jar时也会将这些资源包含进去。

二、修改资源读取代码

Jar包内的资源无法通过File类直接读取(File只能访问本地文件系统的文件),必须使用类加载器从classpath中读取资源。修改MusicPlayer.java中的代码:

package main;

import java.io.InputStream;
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.DataLine;
import javax.sound.sampled.SourceDataLine;

public class MusicPlayer implements Runnable {

    private float volume = 0.3f;

    @Override
    public void run() {
        try {
            // 从classpath根目录读取资源文件
            InputStream is = getClass().getResourceAsStream("/res/music.wav");
            if (is == null) {
                throw new Exception("资源文件/res/music.wav未找到");
            }
            AudioInputStream ais = AudioSystem.getAudioInputStream(is);
            
            AudioFormat format = ais.getFormat();
            DataLine.Info info = new DataLine.Info(SourceDataLine.class, format);
            SourceDataLine line = (SourceDataLine) AudioSystem.getLine(info);

            line.open(format);
            line.start();

            int nBytesRead = 0;
            byte[] abData = new byte[128000];
            while (nBytesRead != -1) {
                nBytesRead = ais.read(abData, 0, abData.length);
                if (nBytesRead >= 0) {
                    for (int i = 0; i < nBytesRead; i++) {
                        // 调整音量
                        abData[i] = (byte) (abData[i] * volume);
                    }
                    line.write(abData, 0, nBytesRead);
                }
            }

            line.drain();
            line.close();
            ais.close();
            is.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

关键说明:getClass().getResourceAsStream("/res/music.wav")会从classpath的根目录查找资源,无论在Eclipse中运行还是Jar包运行,都能正确定位到资源文件。

三、用Eclipse正确打包可执行Jar

  1. 右键点击你的项目 → 选择Export
  2. 在弹出的窗口中展开Java → 选择Runnable JAR File → 点击Next
  3. 在Launch configuration下拉框中,选择你平时在Eclipse中运行程序时使用的启动配置(对应Main类的启动项)
  4. 在Export destination中设置Jar文件的保存路径和文件名
  5. 在Library handling选项中,选择Package required libraries into generated JAR(该选项会把依赖的库也打包进Jar,避免运行时找不到依赖)
  6. 点击Finish完成打包

打包完成后,你可以打开生成的Jar文件查看内部结构,应该能看到main目录(存放class文件)和res目录(存放music.wav),此时运行Jar文件就不会再出现FileNotFoundException了。

内容的提问来源于stack exchange,提问作者iasonas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 01:52:42