我有一个非常尴尬的问题。我生成了一个测试可执行 JAR 文件,它正在生成以下错误:
Exception en thread "AWT-EventQueue-0" java.lang.IllegalArgumentException: URI is not hierarchical
at java.io.File.<init>(Unknown Source)
at Trivia.Interfaz.<init>(Interfaz.java:74) <= mi codigo
从我项目的内部原理图开始。我将程序的图像保存为单独的包。
我拥有图像的包称为“资产”。
好吧,在我加载图像时的代码中,我将其编写如下:
Image img = ImageIO.read(new File(getClass().getResource("/assets/panama-16.png").toURI()));
这样做不会产生任何错误,并且程序在 netbeans IDE 中正常运行,但是当我生成 JAR 可执行文件时问题就开始了。我在某处读到,这是因为在生成可执行文件时,Netbeans 所做的是压缩所有这些文件(ZIP),当然,在使用 URL 方面情况发生了巨大变化。
我的问题是:如何使所有这些图像从项目包内的 JAR 文件中正常运行而没有任何问题?
问题是
getResource
返回一个 URL。当 URL 指向文件系统上的文件时,File
用它们创建File
.我最喜欢的是使用 always
Class.getResourceAsStream(String)
,它返回一个InputStream
你可以从中获取资源的地方。由于
ImageIO.read
它具有接受 a 的重载,因此InputStream
请执行以下操作:在.jar内你不能使用
File
. 请改用 ImageIO.read(InputStream io)。您不能使用文件描述符的原因是.jar中的数据实际上不是文件。请注意, .jar中的路径必须从 jar 的根目录开始,因此以 .jar 开头
/
。我将这两个用于 jar 中的图像: