我有源代码:
private Image getImage(String path, ClassLoader loader) {
InputStream image = null;
try {
image = loader.getResourceAsStream(path);
return new Image(PlatformUI.getWorkbench().getDisplay(), image);
} finally {
if (image != null) {
try {
image.close();
}
catch (IOException e) {
//OK
}
}
}
}
在我的电脑上这段代码运行完美。但是,在虚拟机线上:
loader.getResourceAsStream(path);
总是返回空值。为什么?
编辑:
路径是相对路径。例如:icons/tools/device.png。 我开发的应用程序包含十多个项目。我使用 Eclipse IDE。所有项目都有结构:
- com.pkg.name - 带有类图标的文件夹
- 包含图标和其他文件的文件夹
Jar 文件也有这种结构。
在我的电脑上,应用程序运行完美。在虚拟机(Windows Server(64 位))上,应用程序无法从 Jar 文件加载图像。
最佳答案
如果路径是相对路径,那么它应该可以工作,只要图像资源已经与类文件一起复制(正如 Itay 已经提到的)并且包含图像资源的文件夹或 jar 在类路径上(您使用 CLASSPATH 还是 -cp 来指定类路径?如果您依赖 CLASSPATH,请确保为执行应用程序的用户正确设置了此环境变量)
如果是绝对路径,请仔细检查它在目标 VM 上是否有效。
基本上,对于像这样的文件夹结构
./classes
./images
./libs
命令 java -cp classes;images;libs/* my.app.Application
应该可以工作(java 1.6 - 在旧版本中不允许通配符),假设路径值像 images/myImage.jpg
.
只是另一个想法,类路径定界符在 Windows 上是 ;
,在 unix 上是 :
。如果您在 unix 类型的环境中准备应用程序,那可能会出现问题。
编辑
您是否从与实际类文件相同的库中读取图像?那么请试一试:
this.getClass().getResourceAsStream(path)
编辑
好的,这是 OSGi。因此,应用程序在 eclipse IDE 内部运行但部署为 RCP 应用程序时却不能运行的原因还有一些。我认为这与目标环境无关。
在 OSGi 中,每个 bundle 都有自己的类加载器,bundle1 中的类将无法看到 bundle2 中的类,除非包被正确导出。资源也是如此。我猜图像存储在不同的包中。 getImage方法传递给哪个classloader我不知道,但是那个classloader肯定是看不到资源文件的。
它可能在 eclipse 中工作,尤其是当您将项目添加到彼此的构建路径时。
在您构建产品后,您说它在 VM 上(部分)失败,但同一产品是否在本地计算机(在 eclipse 之外)上显示图像?
关于java - 虚拟机上的类加载器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2145937/