代码之家  ›  专栏  ›  技术社区  ›  Michał Ziober

虚拟机上的类加载器

  •  3
  • Michał Ziober  · 技术社区  · 16 年前

    我有源代码:

    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);
    

    编辑:

    我开发的应用程序包含十多个项目。我使用EclipseIDE。所有项目都有以下结构:

    • com.pkg.name-带有类图标的文件夹
    • 带有图标和其他文件的文件夹

    2 回复  |  直到 16 年前
        1
  •  1
  •   Andreas Dolk    16 年前

    如果path是一个相对路径,那么它应该可以工作,只要图像资源与类文件一起被复制(正如Itay已经提到的),并且包含图像资源的文件夹或jar位于类路径上(您使用classpath或-cp来指定类路径吗?如果依赖类路径,请确保为执行应用程序的用户正确设置了this环境变量)

    如果它是绝对路径,请仔细检查它在目标VM上是否有效。

    基本上,对于这样的文件夹结构

    ./classes
    ./images
    ./libs
    

    命令 java -cp classes;images;libs/* my.app.Application images/myImage.jpg

    再想想,类路径delimter是 ; : 在unix上。如果在unix类型的环境中准备应用程序,则可能会出现问题。

    编辑

    this.getClass().getResourceAsStream(path)
    

    编辑

    好的,我是奥斯基。因此,还有更多的原因说明为什么应用程序可以从EclipseIDE内部工作,而不是作为RCP应用程序部署。我认为这与目标环境无关。

    它可能在eclipse内部工作,特别是如果您将项目添加到彼此的构建路径中。

    构建产品后,您说它在VM上失败(部分),但同一产品是否在本地机器上显示映像(在eclipse之外)?

        2
  •  0
  •   Itay Maman    16 年前

    你没有提供足够的细节,但我猜:

    将代码复制到将由另一台(虚拟)计算机运行的位置时,只复制*.class文件。您需要复制其他资源(特别是图像文件),并将它们与*.class文件一起放置,以便classloder可以检索它们。