为什么Java项目编译为.jar文件后其中的图片无法正常加载?
问题根因
你当前的写法硬编码了工程本地的/src/main/resources/Player.png路径:
- IDEA运行时工作目录默认为工程根目录,所以可以正常读取到该路径下的文件
- 打包编译后,src目录不会被带入产物,resources下的资源会被打包进JAR包内部,不属于本地文件系统的独立文件,用
loadFromFile按本地文件路径读取自然会失败,和你报错日志里的「Unable to open file」完全吻合。
修复步骤
1. 修改资源加载逻辑
不要用本地文件路径读取JAR内的资源,改用类加载器读取资源流,配合jSFML的loadFromStream方法加载纹理:
修改后的DisplaySprite实现:
Texture t = new Texture(); // 用当前类的类加载器读取类路径下的资源流 try (InputStream resStream = GameRenderer.class.getResourceAsStream(path)) { if (resStream == null) { throw new RuntimeException("未找到对应资源:" + path); } // 从流加载纹理,替代原有的文件路径加载 t.loadFromStream(resStream); } catch (IOException e) { e.printStackTrace(); } Sprite s = new Sprite(t); s.setPosition(position.x, position.y); s.setScale(1, 1); s.setRotation(rotation); GameWindow.Get().draw(s);
修改调用参数
原调用的路径写的是工程本地路径,修改为类路径相对路径即可:
// 路径前的/代表从类路径根目录开始查找,对应resources下的根目录 GameRenderer.DisplaySprite("/Player.png", position, rotation);
2. 确认资源目录配置
打开IDEA的File > Project Structure > Modules > 你的开发模块 > Sources标签,确认src/main/resources目录被标记为「Resources」类型,确保打包时资源会被自动打进JAR包的根目录。
3. 验证打包结果
打包完成后可以用解压工具打开JAR包,确认根目录下存在Player.png文件,如果不存在则检查你的artifact配置,确保模块的编译输出和资源文件都被包含到产物中。
内容的提问来源于stack exchange,提问作者FilipeeX
相关产品推荐
相关产品推荐

