1

首先,我知道 Stack Overflow(以及任何有能力的类似论坛的网站)“先搜索,后问”的政策,并且在做功课时,我搜索了各种资源以找到解决问题的方法。话虽如此,我没有找到任何合适的答案,只好亲自问这个问题。

我有一些中等的编程技能,尤其是在 Java 语言方面。我正在使用默认的 Java SE JDK 开发这款 2D 游戏。更具体地说是JDK 7u4。在这个项目中,我们有一个管理大多数 I/O 操作的类。它的一种方法返回文件的路径:

public static URL load(String resource) {
    return ZM.class.getResource(resource);
}

现在,在 Netbeans(7.1 版)上运行项目时,此方法可以正常工作。但是,在构建和清理项目时,生成的 .jar 文件似乎与其创建者不一致。在命令行上运行 .jar 时,JVM 捕获了一个 .jar NullPointerException。似乎无法在 .jar 中读取该文件。按照我的程序员直觉,我开始调试项目。我的第一次尝试是检查该load方法是否是有问题的成员。我进行了一些测试并获得了一些有趣的结果:

在 Netbeans 上运行应用程序并使用“ZM.class”作为方法参数时,它返回:

/D:/Projects/GeometryZombiesMayhem/build/classes/geometryzombiesmayhem/ZM.class

但是从 .jar 文件运行它时,它返回:

file:/D:/Projects/GeometryZombiesMayhem/dist/GeometryZombiesMayhem.jar!/geometryzombiesmayhem/ZM.class

自然,我尝试从中删除初始file:字符串。没有效果。然后我尝试从[...].jar![...]. 再次,什么都没有。我尝试从路径中删除所有可能的排列。没运气。

针对自己的 .jar 文件测试该方法工作正常。现在,当我尝试访问文件的内部时,它不允许我访问。在这个项目的早期版本中,它工作得很好。我不确定发生了什么。欢迎任何帮助。

提前谢谢你,雷纳托

4

2 回答 2

1

从 jar 文件加载资源时,我一直使用类加载器。无论您是从 IDE 中运行、启动可执行 jar 文件还是使用 JNLP 从网站运行程序,一切似乎都一样。

尝试以这种方式加载资源:

 try {
      ClassLoader cl = ZM.getClass().getClassLoader();     
      ImageIcon img  = new ImageIcon(cl.getResource("images/programIcon.jpg"));
      // do stuff with img.
 }
 catch(Exception failed) {
     System.out.println(failed);
 }

还有一个建议 - 您应该为资源创建一个单独的文件夹。在我上面的示例中,图像是我的 src 文件夹中的一个文件夹。这样,当我构建它时,它会自动成为 jar 的一部分,但我将资源与源代码分开。

于 2012-05-20T02:51:01.770 回答
0

我想你的问题是从你的 jar 文件中加载图像。

这是我的做法

URL imageurl = Myclassanme.class.getResource("/test/Ergophobia.jpg"); 
Image myPicture = Toolkit.getDefaultToolkit().getImage(imageurl);
JLabel piclabel = new JLabel(new ImageIcon( myPicture ));
piclabel.setBounds(0,0,myPicture.getWidth(null),myPicture.getHeight(null));

这样我就可以在“测试”包中获取 Ergophobia.jpg 文件。

于 2012-08-22T03:48:48.560 回答