如何在JAR文件中获取src目录外的资源文件?
解决JAR打包后同级res目录资源读取问题
嘿,我完全懂你的痛点——不想打乱自己规划的项目结构,却卡在了JAR打包后资源读不到的问题上。先给你拆解下为什么原来的方法失效,再给你两个不用改目录结构的解决方案:
为什么FileInputStream在JAR里失效?
FileInputStream是从文件系统的物理路径读取文件的,在Eclipse里运行时,你的项目根目录是当前工作目录,所以res/misc/foo.txt能找到对应的文件。但打包成JAR后,res里的文件是被嵌入到JAR包内部的,不再是文件系统里的独立文件,自然就找不到了。
不用调整目录结构的解决方法
方法1:把res目录设为Eclipse的“源文件夹”
这是最简单的操作,能让Eclipse自动把res里的资源纳入classpath:
- 在Eclipse中右键你的
res目录 - 选择
Build Path→Use as Source Folder
设置完成后,Eclipse编译项目时会把res里的内容(比如misc/foo.txt)复制到和class文件同级的输出目录(默认是bin),打包JAR时也会包含这些资源。这时候你就可以用以下代码读取:
InputStream is = YourCurrentClass.class.getResourceAsStream("/misc/foo.txt"); BufferedReader br = new BufferedReader(new InputStreamReader(is)); // 后续读取逻辑和之前一致
这里的路径/misc/foo.txt是因为res被设为源文件夹后,它的根目录对应classpath的根,所以直接从根路径找misc/foo.txt即可。
方法2:手动配置构建路径,让res内容复制到输出目录
如果你不想把res设为源文件夹,也可以手动指定Eclipse在构建时复制res的内容:
- 右键项目 →
Properties→Java Build Path→ 切换到Source标签页 - 点击右侧的
Add Folder,选中你的res目录并添加 - 可以在下方的
Output folder选项中,把res的输出目录设置为和src一样的目录(比如默认的bin)
这样编译时res里的文件会被复制到输出目录,打包JAR后同样会被包含进去,读取方式和方法1完全一致。
总结
你完全不需要调整项目目录结构,只要通过上述两种配置,让res里的资源被纳入classpath,getResourceAsStream就能正常读取——不管是在Eclipse中运行,还是打包成JAR后都没问题。
内容的提问来源于stack exchange,提问作者user9245461
相关产品推荐
相关产品推荐

