Java getResourceAsStream():如何确定首先搜索的位置?
想象一下下面的文件夹结构Java getResourceAsStream():如何确定首先搜索的位置?,java,jar,classpath,directory,bufferedimage,Java,Jar,Classpath,Directory,Bufferedimage,想象一下下面的文件夹结构 文件夹 App.jar img(实际上我不知道它在那里) 在App.jar中还有img文件夹 因此,我使用以下代码来读取图像img InputStream is = IconManager.class.getClassLoader().getResourceAsStream("img/1.png"); BufferedImage bimage = ImageIO.read(is); is.close(); 我以前就知道,这个代码片段非常适合从jar本身读取文件
- 文件夹
- App.jar
- img(实际上我不知道它在那里)
img
文件夹
因此,我使用以下代码来读取图像img
InputStream is = IconManager.class.getClassLoader().getResourceAsStream("img/1.png");
BufferedImage bimage = ImageIO.read(is);
is.close();
我以前就知道,这个代码片段非常适合从jar本身读取文件。但由于碰巧在文件夹中有过时的img版本,它开始从外部img
:文件夹/img而不是jar本身读取图像文件。我花了很多时间来弄清楚
我的问题是,为什么默认情况下,代码段尝试从文件夹/img而不是App.jar读取?
UPD:我使用java-jarapp.jar
从文件夹运行它
我使用windows 7,在构建jar之前从未在Eclipse中指定类路径更改类路径中项目的顺序我相信搜索顺序基本上取决于类加载器
。它可以选择使用该文件夹,因为它首先在类路径上列出,或者完全出于其他原因。App.jar也可能有一个ClassLoader
,它被配置为使用“父级优先”策略(尽管这更可能发生在jboss之类的服务器环境中),这意味着它将首先要求其父级ClassLoader
查找资源,然后再检查自己的类路径。也许有人可以确认/纠正我。@hoaz,我没有指定任何类路径,我是从Eclipse@NikolayKuznetsov这只意味着Eclipse为您指定了类路径,您仍然可以更改顺序。如果您只有一个项目,那么我建议您从JAR文件中提取清单,按照您想要的方式编辑它,并将其放入您的项目中,然后在导出jar对话框中指定这个清单文件,eclipse将包含它,而不是生成默认清单文件