Eclipse中应用打包为jar后resources文件夹资源无法加载问题求助
问题根因
你将resources设为源文件夹后,打包时该文件夹下的文件会直接写入Jar包的类路径根目录,不会保留resources文件夹本身。Jar包是归档文件,内部资源不属于操作系统可直接识别的独立文件,你当前使用的FileInputStream、直接传文件路径的API只能读取本地磁盘的独立文件,无法读取Jar包内部资源,这就是Eclipse运行正常(运行时是本地文件夹结构)、打包后失效的核心原因。
你之前尝试getResourceAsStream不生效,基本是因为路径错误携带了resources/前缀导致的。
适配代码调整
1. 只读类资源加载(图标、读取MP3)
直接通过类加载器读取类路径下的资源,不需要加resources/前缀:
// 加载图标 Image icon = Toolkit.getDefaultToolkit().getImage(this.getClass().getClassLoader().getResource("icon.jpg")); // 读取MP3文件 player = new Player(this.getClass().getClassLoader().getResourceAsStream("current.mp3"));
注意:如果在静态方法中调用,把
this.getClass()替换为你的启动类类名,比如AppMain.class.getClassLoader()
2. 可写类资源调整(写入MP3)
Jar包本身是只读文件,无法直接修改内部内容,你不能直接往Jar包里的current.mp3写入数据,需要调整逻辑:
把Jar包里的current.mp3作为默认模板,首次运行时把模板资源写入Jar包外的本地目录,后续所有读写操作都针对这个外部独立文件执行:
// 定义外部存储的MP3文件路径,这里存在程序运行目录的data文件夹下 File externalMp3Dir = new File(System.getProperty("user.dir") + File.separator + "data"); if (!externalMp3Dir.exists()) { externalMp3Dir.mkdirs(); } File externalMp3 = new File(externalMp3Dir, "current.mp3"); // 首次运行时把Jar内的默认MP3写入外部目录 if (!externalMp3.exists()) { try (InputStream defaultMp3Stream = this.getClass().getClassLoader().getResourceAsStream("current.mp3"); FileOutputStream out = new FileOutputStream(externalMp3)) { byte[] buffer = new byte[1024]; int len; while ((len = defaultMp3Stream.read(buffer)) != -1) { out.write(buffer, 0, len); } } } // 后续写入操作直接使用外部文件 OutputStream outstream = new FileOutputStream(externalMp3);
校验说明
打包完成后可以用解压工具打开Jar包,确认根目录下存在icon.jpg和current.mp3两个文件,避免打包配置错误导致资源缺失。
内容的提问来源于stack exchange,提问作者Jad Al-Hamwi
相关产品推荐
相关产品推荐

