在 jar 中加载图像/文件

Loading images/files inside jar

提问人:hinrich. 提问时间:3/15/2022 最后编辑:Andrew Thompsonhinrich. 更新时间:3/16/2022 访问量:72

问:

这个问题已经有很多答案了。我也尝试了很多。我还没有找到解决方案。

我在我的项目中加载了一些图像(Swing - ImageIcons)。在运行对话框中,所有这些它们也都显示在我的 GUI 中。但是编译后程序根本无法启动。错误消息因过程而异。

最后,我尝试简单地加载 a 来打印绝对路径。然后看起来像这样:File

File f = new File(Loadscreen.class.getResource("../../../../resources/materials/icon.png").getFile());
System.out.println(f.getAbsolutePath());

控制台为此返回一个:NullPointerException

控制台编译:

Exception in thread "main" java.lang.NullPointerException
        at de.franken.ration.gui.Loadscreen.<init>(Loadscreen.java:43)
        at de.franken.ration.Rationboard.onEnable(Rationboard.java:84)
        at de.franken.ration.Rationboard.main(Rationboard.java:75)

控制台 Eclipse:

H:\Users\Hinrich\Documents\Java\Rationboard\bin\resources\materials\icon.png

在第 43 行中,我定义了 .f

我的树看起来像这样:

Rationsboard
L_ src
  L_ de
    L_ franken
      L_ ration
        L_ gui
          L_ Loadscreen.class
  L_ resources
    L_ materials
      L_ icon.png

但是,该图标包含在 JAR 中。

感谢所有回应的人。

编辑: 我玩得更多了。只要要加载的资源在同一个包中,就可以加载。但是如果我用 更改包,就会出现。../NullPointerException

java swing nullpointerexception imageicon getresource

评论


答:

0赞 vanxa 3/15/2022 #1

作为第一步,您可以通过运行 来验证图标是否包含在 jar 中。jar -tf file.jar

你试过吗

File f = new File(Loadscreen.class.getResource("/materials/icon.png").getFile()); System.out.println(f.getAbsolutePath());

假设在文件夹中?icon.pngresources/materials

评论

0赞 hinrich. 3/15/2022
您好,感谢您的帮助。我不能使用你的命令,因为我使用 Eclipse 进行编译。但是我已经检查了该图标是否在带有文件存档器的 JAR 中。我也试着用你的路。在这里,我也遇到了一个错误。但是,该文件不能位于该位置,因为它位于包外部
1赞 g00se 3/16/2022
就我个人而言,我会确保整个 /resources 树都进入根目录的部署 jar。使用资源路径“/resources/materials/icon.png”加载 technojeeves.com/index.php/aliasjava1/...
0赞 hinrich. 3/16/2022
谢谢!挫折已经让位于启蒙。我曾想象过相对和绝对路径规范下的其他事情。现在它工作得很好。
1赞 Andrew Thompson 3/16/2022 #2

用:

this.getClass().getResource("/resources/materials/icon.png"); 

请注意问题中所看到的方法的两个差异:

  1. this.getClass()将找到适合应用程序资源的上下文类装入器。
  2. "/resources/materials/icon.png"前导将告诉方法从类路径或 Jar 的根目录进行搜索。/getResource

顺便说一句:在任何时候都不要涉及文件。 返回 一个 和 Jar 中的资源不能作为对象访问。getResourceURLFile

评论

0赞 hinrich. 3/16/2022
谢谢。现在所有图像都已加载。但是,我该如何处理我需要的 XML? 我将此 XML 作为受保护的模板传输。路径:Files(DocumentBuilder) db.parse(File file);/resources/files/profile.rat
0赞 Andrew Thompson 3/16/2022
(DocumentBuilder) db.parse(File file);很多时候,我们应该引用一个类的 JavaDocs。这是一个很好的示例,因为该方法被重载以接受许多不同类型的对象。例如 DocumentBuilder.parse(uri)。对于更通用的对象,还有另一种方法 - .parseInputStream