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

为什么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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 10:54:04