【问题标题】:Getting resources works from NetBeans Execution Context but not working when jar is executed from comand line从 NetBeans 执行上下文获取资源有效,但从命令行执行 jar 时无效
【发布时间】:2015-04-23 02:48:40
【问题描述】:

我有一个代码,我在其中创建 Java 操作并尝试将图标与它们相关联。一个代码快照是

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 文件时,它失败并出现异常。

有什么想法吗?与类路径有什么关系?资源文件夹作为包放在主包中。

提前致谢!

【问题讨论】:

  • 资源在 JAR 中吗?
  • 是的,是的。主包是controllz.mmi,资源包是controllz.mmi.resources。 5he 试图获取资源的类位于 controllz.mmi.models 包中。如前所述,它从 bean IDE(运行和调试)而不是从命令行使用 java -jar Controllz_MMI.jar 工作。 Jar 文件被放到 beans 项目的“dest”子文件夹中,我尝试从那里运行它...

标签: java image netbeans jar resources


【解决方案1】:

我不完全确定在您的情况下会引发什么异常,尽管假设它是 NullPointerExceptionIOExceptionIllegalArgumentException 派生自

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

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

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

此外,您的文件名必须准确无误,特别是扩展名。在这种情况下,您访问的是 File-Open-icon24x24.png,无论实际文件是在 Netbeans 中由 png 还是 PNG 扩展,它都可以正常工作,但是一旦导出扩展案例就很重要。

最后,如果这些更改都不能解决您的问题,我会检查您的文件路径,因为很可能存在逻辑错误。

在 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 创建一个文本文件,以查看它的放置位置。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-25
    • 2012-01-01
    • 1970-01-01
    • 2013-05-13
    • 2014-07-31
    • 2011-03-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多