Java 16 - создать объект File из ресурса в затененной банке
У меня есть файл SVG, расположенный во вложенной папке моего проекта, и я создаю объект File, используя этот код:
URI tempUrl = getClass().getResource("/Resources/matlab_icon.svg").toURI();
File tempFile = new File(tempUrl);
Все объединяется в затененный jar-файл для запуска.
В Java 13 это работает без проблем . Но я обновился до Java 16 и теперь получаю такую ошибку:
java.lang.IllegalArgumentException: URI is not hierarchical
at java.base/java.io.File.<init>(File.java:420)
Это URI, который он пытается использовать
tempURL = jar:file:/C:/Program%20Files/PamguardJava16/PamguardBeta-2.01.06.jar!/Resources/matlab_icon.svg
Я рассмотрел этот вопрос (почему мой URI не иерархический?) И этот вопрос (файл Java Jar: ошибки использования ресурсов: URI не иерархический ), оба из которых точно описывают мою проблему. Но это старые вопросы, поэтому я не понимаю, почему мой код работал до сих пор. Что еще более важно, я не могу использовать рекомендованное решение, потому что я не могу изменить свой код на
getResourceAsStream
.
Я пробовал изменить / на \\, опуская начальный / и используя
getClass().getClassLoader().getResource("/Resources/matlab_icon.svg").toExternalForm()
вместо этого, но тогда Java вообще не может найти файл:
java.lang.NullPointerException: Cannot invoke "java.net.URL.toURI()" because the return value of "java.lang.Class.getResource(String)" is null
У меня была такая же проблема в нескольких других местах при загрузке файла wav. Но те, которые я смог изменить на AudioInputStream, чтобы исправить это (который также сказал мне, что URI правильно указывает на файлы, это, в частности, проблема с созданием объекта File). Любая помощь будет принята с благодарностью. Спасибо.