打包为.jar文件后无法读取资源的问题求助
问题分析与解决方案
错误原因
你用FileInputStream读取JAR包内的资源是错误的:
- IDE运行时,资源是文件系统里的真实文件,
getResource().getFile()能拿到有效路径,FileInputStream可以正常读取 - 打包成JAR后,资源是JAR内部的压缩条目,并非独立文件,
getResource().getFile()返回的是类似file:xxx.jar!/path的URL路径,这不是操作系统能识别的文件路径,因此FileInputStream会抛出FileNotFoundException
修复代码
替换原有的资源读取逻辑,改用getResourceAsStream()直接获取输入流,无需依赖文件路径:
try (InputStream is = Shader.class.getClassLoader().getResourceAsStream(sourceVertex)) { if (is == null) { throw new IllegalArgumentException("资源文件不存在: " + sourceVertex); } sourceVertex = new String(is.readAllBytes()); } catch (IOException e) { e.printStackTrace(); }
关键说明
getResourceAsStream()会直接从类路径(包括JAR包内)读取资源,返回的输入流可以直接读取资源内容- 务必添加空值判断:如果资源路径错误,
getResourceAsStream()会返回null,提前判断可以避免后续的NullPointerException - 使用try-with-resources语法,确保输入流自动关闭,避免资源泄漏
内容的提问来源于stack exchange,提问作者Danila Maximov
相关产品推荐
相关产品推荐

