3

我正在访问要在我的 JavaFX 应用程序中使用的 Java 资源。

URL resource = getClass().getClassLoader().getResource("/image.jpg");
File file = new File(resource.getFile());
if (!file.exists()) {
    throw new FileNotFoundException("No image: " + file)
}

一切正常,并且在作为 Java 应用程序运行时找到了资源。

但是,现在我正在使用 zenjava 的 Maven 插件将我的 JavaFX 应用程序捆绑在本机 Mac 应用程序中:

<plugin>
    <groupId>com.zenjava</groupId>
    <artifactId>javafx-maven-plugin</artifactId>
    <version>2.0</version>
    <configuration>
        <mainClass>
            com.seaniscool.foobar.FooBar
        </mainClass>
    </configuration>
</plugin>

我使用本机插件构建:

mvn clean jfx:native

现在,当我通过运行 Mac.app文件运行应用程序时,该资源无法再解析为文件。getResource返回此网址:

jar:file:/Projects/foobar/target/foobar.app/Contents/Java/foobar-jfx.jar!/image.jpg

File但是作为路径使用时找不到。

4

2 回答 2

1

URL在_

URL resource = getClass().getClassLoader().getResource("/image.jpg");

是一个uniform resource locator。在这种情况下,它会/image.jp.jar文件中定位由 标识的资源。事实证明,这是一种zip文件。

jar:file:/Projects/foobar/target/foobar.app/Contents/Java/foobar-jfx.jar!/image.jpg

zip 条目不是文件,它只是一堆对 zip 文件有意义的字节。如果您想将这些字节作为InputStream, 膨胀的,您可以简单地调用

InputStream inputStream = resource.openStream();

请参阅 .java 文档URL#openStream()

于 2013-10-15T19:33:32.357 回答
0

您必须使用完全限定的名称含义:/package1/package2/.../file-name/file-name直接

于 2013-10-15T19:27:00.397 回答