首先,我知道 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 捕获了 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 文件测试该方法效果良好。现在,当我尝试访问文件内部时,它不允许我。在这个项目的早期版本中,它运行得很好。我不太确定发生了什么事。欢迎任何帮助。
预先感谢您, 雷纳托
最佳答案
当从 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);
}
还有一个建议 - 您应该为资源创建一个单独的文件夹。在上面的示例中,images 是 src 文件夹内的一个文件夹。这样,当我构建它时,它会自动成为 jar 的一部分,但我将资源与源代码分开。
关于Java - Netbeans 的 .jar 意外问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10670282/