Не удается получить доступ к ресурсу Java, если он упакован в пакет приложений Mac

Я получаю доступ к ресурсу Java для использования в приложении JavaFX.

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

Все работает нормально, и ресурс обнаруживается при запуске в качестве приложения Java.

Однако теперь я связываю свое приложение JavaFX с нативным приложением Mac, используя плагин zenjava Maven:

<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 возвращает этот URL:

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

Но это не может быть найдено при использовании в качестве File дорожка.

2 ответа

Решение

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();

См. URL#openStream() ,

Вы должны использовать полное имя, означающее: /package1/package2/.../file-name не /file-name непосредственно

Другие вопросы по тегам