在Mac应用程序包中打包时无法访问Java资源

时间:2013-10-15 19:14:45

标签: java macos javafx native app-bundle

我正在访问要在我的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路径时无法找到它。

2 个答案:

答案 0 :(得分: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();

See the javadoc of URL#openStream().

答案 1 :(得分:0)

您必须使用完全限定名称:/package1/package2/.../file-name而不是/file-name直接