java - 虚拟机上的类加载器

标签 java swt classloader

我有源代码:

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/

相关文章:

android - 使用 ClassLoader 和 openRawResources 加载 apk

java - loadClass((“完全合格的类名称”)和<ClassName> .class.getDeclaredConstructors之间有什么区别

java - blueJ kareltje 在世界各地 build 港口

java - JMS 的示例代码和环境设置

java - 如何向链表添加元素?

java - SWT CLabel 垂直颜色渐变

java - 是否有任何对象作为数据和 LabelProvider 用于显示的 SWT 组合框?

java - Mac 64位cocoa环境下如何获取AWT控件的句柄?

java - 无法解析符号 CoordinatorLayout

java - 解释类加载器如何加载静态变量