提问人:hinrich. 提问时间:3/15/2022 最后编辑:Andrew Thompsonhinrich. 更新时间:3/16/2022 访问量:72
在 jar 中加载图像/文件
Loading images/files inside jar
问:
这个问题已经有很多答案了。我也尝试了很多。我还没有找到解决方案。
我在我的项目中加载了一些图像(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
答:
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.png
resources/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");
请注意问题中所看到的方法的两个差异:
this.getClass()
将找到适合应用程序资源的上下文类装入器。"/resources/materials/icon.png"
前导将告诉方法从类路径或 Jar 的根目录进行搜索。/
getResource
顺便说一句:在任何时候都不要涉及文件。 返回 一个 和 Jar 中的资源不能作为对象访问。getResource
URL
File
评论
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)。
对于更通用的对象,还有另一种方法 - .parse
InputStream
评论