如何修正可运行JAR包中资源文件路径指向错误问题?
搞定JAR包读取内部资源的路径问题
兄弟,我太懂你踩的这个坑了!打包成JAR后读settings.xml报FileNotFoundException,核心原因是:IDE里运行时,文件是存在于本地文件系统的,但打包成JAR后,这些文件是被塞进JAR包内部的资源条目,不再是独立的本地文件,所以你用本地文件路径去找肯定找不到。
下面给你两种靠谱的解决办法,直接就能用:
方法1:用类加载器读资源流(最推荐)
直接通过类加载器获取资源的输入流,不管是IDE运行还是JAR运行都能正常工作:
// 路径从classpath根开始,对应你src下的结构:/ch/makery/address/util/settings.xml InputStream inputStream = getClass().getResourceAsStream("/ch/makery/address/util/settings.xml"); if (inputStream == null) { throw new IOException("找不到settings.xml资源文件"); } // 接下来就可以读取内容了,比如用BufferedReader BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream)); String line; while ((line = reader.readLine()) != null) { // 处理你的文件内容 } // 记得关流 reader.close(); inputStream.close();
要是你在静态方法里调用,就换成用当前类的class对象获取:
InputStream inputStream = YourCurrentClass.class.getResourceAsStream("/ch/makery/address/util/settings.xml");
方法2:获取资源URL(别直接转File!)
如果你需要拿到资源的URL,注意绝对不能转成File对象(JAR里的资源不是本地文件),但可以用URL打开流:
URL resourceUrl = getClass().getResource("/ch/makery/address/util/settings.xml"); if (resourceUrl == null) { throw new FileNotFoundException("settings.xml不存在于JAR包中"); } InputStream inputStream = resourceUrl.openStream(); // 后续读取逻辑和上面一样
为啥之前的路径会崩?
在IDE里跑的时候,src下的文件会被复制到编译输出的classpath目录里,此时它是本地文件系统里的真实文件,所以你写的路径能找到;但打包成JAR后,所有资源都被打包成JAR里的一个“条目”,根本不在你本地的c:\users\bob\Desktop\src\...这个路径下,自然就报找不到文件了。
额外提醒
- 路径开头的
/:带/是从classpath根目录找,不带的话是从当前类所在的包路径找。比如你的类就在ch.makery.address.util包下,那直接写settings.xml也能找到。 - 打包别漏资源:确保你的构建工具(Maven/Gradle或者IDE自带的打包工具)把
settings.xml正确塞进JAR里,一般默认都会处理,但如果是自定义结构,记得检查下打包配置。
内容的提问来源于stack exchange,提问作者C.Ikongo
相关产品推荐
相关产品推荐

