Java游戏Jar文件无法加载PauseOverlay资源问题求助
问题重现
我用VSCode开发了一款依赖大量.png资源的简易Java游戏,IDE内运行一切正常,但导出为.jar文件后,菜单界面能正常运行,点击开始游戏时触发错误,提示PauseOverlay加载失败,报错信息如下:
Exception in thread "Thread-0" java.lang.IllegalArgumentException: input == null! at java.desktop/javax.imageio.ImageIO.read(ImageIO.java:1356)
问题定位在PauseOverlay类的第43行。
排查修复步骤
核对Jar包内资源结构与路径
用压缩软件直接打开生成的.jar文件,确认PauseOverlay所需的.png资源是否被正确打包进去,且文件路径和代码中读取的路径完全匹配。IDE运行时资源可能存放在项目resources目录,但打包配置错误会导致资源遗漏或路径层级改变。替换资源读取方式
代码中如果用File类读取资源(比如new File("xxx.png")),Jar包内的资源无法通过File路径访问,必须改用类加载器的getResourceAsStream方法。例如:
原错误写法:ImageIO.read(new File("resources/pause_overlay.png"));修正后写法:
ImageIO.read(getClass().getResourceAsStream("/resources/pause_overlay.png"));注意路径开头的斜杠代表Jar包根目录,要和资源在Jar内的实际存储路径一致。
检查VSCode打包配置
若使用VSCode的Java打包插件,确保配置中包含所有.png资源。如果用Gradle或Maven管理项目,需确认资源目录配置正确:
Gradle示例:sourceSets { main { resources { srcDirs = ["src/main/resources"] } } }Maven示例:
<build> <resources> <resource> <directory>src/main/resources</directory> <includes> <include>**/*.png</include> </includes> </resource> </resources> </build>验证资源文件名大小写
Windows系统文件名不区分大小写,但Java读取Jar内资源时严格区分大小写。检查代码中写的文件名(如PauseOverlay.png)和实际文件的文件名(如pauseoverlay.png)是否完全一致,包括大小写细节。
内容的提问来源于stack exchange,提问作者Stefan Cohn

