【发布时间】:2019-02-15 11:44:35
【问题描述】:
我使用 Eclipse 在 Java 中进行了一个项目,该项目需要加载一些图像并显示它们。起初,我是这样加载它们的:
InputStream stream = MyClass.class.getClass().getResourceAsStream("/resources/ui/icons/" + name);
Image img = ImageIO.read(stream).getScaledInstance(size.width, size.height, Image.SCALE_SMOOTH);
无论我是从 Eclipse 还是从可执行 jar 运行它,这都很好。但是我最近买了一台新笔记本电脑,当我尝试在新机器上运行它时,jar 无法运行; stream 总是变成null。但是,当我从 Eclipse 内部运行时,不会出现此问题。
最后,经过一番实验,我把代码改成了直接在MyClass.class上调用getResourceAsStream()而不调用getClass():
InputStream stream = MyClass.class.getResourceAsStream("/resources/ui/icons/" + name);
Image img = ImageIO.read(stream).getScaledInstance(size.width, size.height, Image.SCALE_SMOOTH);
而且由于某种原因,它有效。我的新笔记本电脑具有与旧笔记本电脑相同的操作系统(Windows 10)和其他设置,但它运行的是 Eclipse Photon 而不是 Oxygen。
那么,这两种加载资源的方式有什么区别呢? (我听说这是关于 ClassLoaders 的东西,但我不记得确切的词了。)为什么切换到新机器会破坏第一个机器?即使是第二个,我做得对吗?
【问题讨论】:
标签: java jar resources classloader resource-loading