Не удается получить доступ к ресурсу 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();
Вы должны использовать полное имя, означающее: /package1/package2/.../file-name
не /file-name
непосредственно