2010-01-27 127 views
3

在我的源代码: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文件加载图像。

+2

您能否澄清一下,您在谈论什么虚拟机?我虽然乍一看JVM,但这可能是一个错误的假设。 – 2010-01-27 10:11:37

+0

当然。虚拟机意味着 - 一个64位的Windows服务器。 http://en.wikipedia.org/wiki/Virtual_machine。 – 2010-01-27 10:22:00

+1

另一个问题 - 是标准的Java应用程序,OSGI甚至RCP的基础?如果是OSGi或RCP,则可以通过仔细检查清单及其导出/导入部分来解决问题。 – 2010-01-27 12:35:49

回答

1

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

如果它是绝对路径,如果它在目标VM上有效。

所以基本上,对于一个文件夹结构等

./classes 
./images 
./libs 

命令java -cp classes;images;libs/* my.app.Application应该工作(java的1.6 - 在较旧版本中的通配符是不允许的),假定像images/myImage.jpg路径值。

只是一种思路,类路径delimter是;在Windows和:在UNIX上。如果您在unix类型的环境中准备应用程序,这可能会成为问题。

编辑

你读同一库,你实际的类文件的形象呢?那么请试试这个:

this.getClass().getResourceAsStream(path) 

编辑

OK,这是OSGi的。因此,该应用程序在eclipse IDE中工作的原因还有一些,但在部署为RCP应用程序时没有。我认为这与目标环境无关。

在OSGi中,每个bundle都有自己的类加载器,bundle1中的类将无法从bundle2中看到类,除非这些包已正确导出。资源也是如此。我猜想图像存储在不同的包中。我不知道哪个类加载器被传递给getImage方法,但该类加载器肯定无法看到资源文件。

它可能在eclipse中工作,特别是如果您将项目添加到其他构建路径。

构建产品后,您说它在虚拟机上(部分)失败,但同一产品是否在本地计算机上显示图像(在eclipse外)?

+0

我不使用CLASSPATH。 ClassLoder需要CLASSPATH吗? – 2010-01-27 11:07:15

+0

我测试了这个方法(this.getClass()。getResourceAsStream(path))。不幸的是,回报总是空。 “ – 2010-01-27 13:54:21

+0

”同一产品是否在本地机器上显示图像(在eclipse外)?“ - 不!你是对的!我做了很多测试。现在一切正常。我使用了继承自UDIGApplication的类的类加载器。我在这个类的“init”方法中加载图像。感谢您的帮助。 – 2010-01-27 15:27:38

0

你没有提供足够的细节,但这里是我的猜测:

当您将代码复制到它会被其他(虚拟)仅复制* .class文件计算机上运行的位置。您需要复制其他资源(特别是图像文件),并将它们与* .class文件一起放置,以便类文件编码器可以检索它们。

当您使用Eclipse(或其他IDE)开发代码时,Eclipse负责将资源从src /目录复制到bin /目录。

+0

我确定所有文件都存在于虚拟机上。我总是将我的源代码导出到Jar文件。 Jar包含所有资源文件。 – 2010-01-27 10:31:27