获取资源可以从NetBeans执行上下文中运行,但是当从命令行执行jar时不能正常工作

时间:2015-02-21 12:14:42

标签: java image netbeans jar resources

我有一个代码,我在其中创建Java Actions并尝试将Icons与它们相关联。代码的一个快照是

FileOpenCommand fileOpen = new FileOpenCommand(this);
fileOpen.putValue("ImageOnly", false);
fileOpen.putValue(Action.NAME, "Open");

fileOpen.putValue(Action.SMALL_ICON, new ImageIcon(getClass().getResource("../resources/File-Open-icon24x24.png")));        

fileOpen.putValue(Action.SHORT_DESCRIPTION, "Opens the existing file.");
fileOpen.putValue("Group", "File");
fileOpen.putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_O, ActionEvent.CTRL_MASK));

this.commands.put("FileOpen", fileOpen);    

重音是我尝试将Action.SMALL_ICON属性设置为操作的行。这在NetBeans环境中以调试或释放模式执行时有效。但是,当我尝试从命令行执行jar文件时,它会失败,但是例外。

有什么想法吗?与classpath有什么关系? Resources文件夹作为主包中的包。

提前致谢!

1 个答案:

答案 0 :(得分:1)

我不完全确定您的案例中会抛出什么异常,但假设它是NullPointerExceptionIOExceptionIllegalArgumentException派生自

fileOpen.putValue(Action.SMALL_ICON, new ImageIcon(getClass().getResource("../resources/File-Open-icon24x24.png")));

只需在getClassLoader()getClass()之间添加getResource()即可解决您的问题,如下所示:

fileOpen.putValue(Action.SMALL_ICON, new ImageIcon(getClass().getClassLoader().getResource("../resources/File-Open-icon24x24.png")));

此外,您必须准确地使用文件名,特别是扩展名。在这种情况下,您正在访问File-Open-icon24x24.png,无论实际文件是否在Netbeans中由pngPNG进行扩展,它都将正常运行,但一旦导出,扩展案例就会很重要。< / p>

最后,如果这些更改都没有解决您的问题,我会检查您的文件路径,因为在某个地方很可能出现逻辑错误。

在Netbeans中使用嵌入式资源时,您应该有一个资源文件夹,其中包含您需要的其他文件夹或任何数据,但这个文件夹应该位于Netbeans项目的src内。夹。 getClass().getResource()返回包行顶部的目录,这意味着如果您的类包是com.example.code,则编译器将查找与com相同级别的文件/文件夹。打开Netbeans src文件夹,您应该看到最初的com文件夹。您的资源文件夹应直接放在该文件夹旁边,因为它将正确嵌入jar文件导出。

在您的代码中,您的路径为../resources/File-Open-icon24x24.png,这使您对..的原因感到困惑。我看不到你的文件夹结构,所以我无法在这个笔记上给出一个精确的答案,但你可能访问了错误的位置,虽然我觉得你并不像你说的那样你的项目在Netbeans中运行正常。但是,由于上述放置,您的资源文件可能无法正确编码到jar文件中。要测试jar文件实际包含的内容,请复制该文件(出于安全原因)并将文件扩展名从jar更改为zip。然后,您可以在Windows资源管理器中查看其内容,并查看其目录结构。文件夹结构的另一个调试技巧是在您尝试访问的URL处创建一个文本文件,以查看它的放置位置。