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
- 右键点击你的项目 → 选择
Export - 在弹出的窗口中展开
Java→ 选择Runnable JAR File→ 点击Next - 在
Launch configuration下拉框中,选择你平时在Eclipse中运行程序时使用的启动配置(对应Main类的启动项) - 在
Export destination中设置Jar文件的保存路径和文件名 - 在
Library handling选项中,选择Package required libraries into generated JAR(该选项会把依赖的库也打包进Jar,避免运行时找不到依赖) - 点击
Finish完成打包
打包完成后,你可以打开生成的Jar文件查看内部结构,应该能看到main目录(存放class文件)和res目录(存放music.wav),此时运行Jar文件就不会再出现FileNotFoundException了。
内容的提问来源于stack exchange,提问作者iasonas
相关产品推荐
相关产品推荐

