Java卡牌游戏导出Jar/CMD启动时遇java.io.FileNotFoundException求助
解决Java项目导出Jar/CMD启动时资源文件找不到的问题
问题根源
你遇到的FileNotFoundException完全是资源路径的错误使用导致的:
- Eclipse运行时,
src是文件系统中的真实目录,所以带src的路径或相对文件系统的路径能正常访问。 - 但导出Jar后,
src目录不会被打包进Jar,所有资源会被整合到类路径(classpath)内部,此时通过FileInputStream访问文件系统路径、或使用带src的路径,自然找不到资源。
具体解决方案
1. 修正图片资源路径
原代码:
new ImageIcon(getClass().getResource("/src/controller/resource/account.jpg"));
错误点:/src/是Eclipse项目的源目录路径,Jar中不存在这个目录。
修改为(去掉src/前缀,使用类路径绝对路径):
new ImageIcon(getClass().getResource("/controller/resource/account.jpg"));
说明:编译后,
src/controller/resource/account.jpg会被复制到类路径根目录下的controller/resource/account.jpg,所以用类路径绝对路径可以直接访问。
2. 修改音频资源的读取方式
原AudioManager用FileInputStream读取文件,只能访问文件系统中的独立文件,无法读取Jar内部的资源。必须改用类加载器获取输入流。
修改后的play方法:
public void play(String resourcePath) { try { // 通过类加载器获取Jar内资源的输入流 InputStream in = getClass().getResourceAsStream(resourcePath); if (in == null) { throw new FileNotFoundException("Resource not found: " + resourcePath); } AudioInputStream audioIn = AudioSystem.getAudioInputStream(new BufferedInputStream(in)); clip = AudioSystem.getClip(); clip.open(audioIn); clip.start(); } catch (FileNotFoundException e1) { e1.printStackTrace(); } catch (IOException e1) { e1.printStackTrace(); } catch (UnsupportedAudioFileException e1) { e1.printStackTrace(); } catch (LineUnavailableException e1) { e1.printStackTrace(); } }
对应的调用代码(去掉./src/前缀,使用类路径绝对路径):
AudioManager.getInstance().play("/resource/sposta.wav");
通用规范建议
- 统一资源目录:将所有资源(图片、音频等)放到
src下的专门目录(如resources),并在Eclipse中右键该目录 →Build Path→Use as Source Folder。这样编译和打包时,资源会自动被复制到类路径根目录,路径更清晰。 - 路径大小写:Jar内的路径是大小写敏感的,确保代码中的路径和资源文件名完全匹配(Windows文件系统不区分大小写,但Linux/Jar环境区分)。
- 打包验证:导出Jar时,在Eclipse的导出向导中,确认所有资源文件被勾选包含,避免资源遗漏。
内容的提问来源于stack exchange,提问作者MaFiore
相关产品推荐
相关产品推荐

