#java #graalvm #graalvm-native-image #substratevm
#java #graalvm #graalvm-native-image #субстратевм #substratevm
Вопрос:
У меня есть файл jar, который содержит некоторый текстовый файл внутри, я пытаюсь загрузить файл как:
InputStream in = Thread.currentThread().getContextClassLoader().getResourceAsStream(path);
Это не работает, так как отображается ошибка :
[SUB] java.lang.NullPointerException
[Thu Aug 27 12:07:48 SGT 2020][INFO] [SUB] at java.io.Reader.<init>(Reader.java:167)
[Thu Aug 27 12:07:48 SGT 2020][INFO] [SUB] at hellofx.HelloFX.readFileAsStringFromJar(HelloFX.java:116)
[Thu Aug 27 12:07:48 SGT 2020][INFO] [SUB] at hellofx.HelloFX.test(HelloFX.java:107)
Если я попытаюсь извлечь файл ресурсов в classpath src/main/resources
, то он работает нормально.
Мой вопрос в том, можем ли мы прочитать файл ресурсов из Jar (при запуске в GraalVM native-image)? Существует множество сторонних библиотек Java, которые читают файлы ресурсов, которые объединены в одном Jar, как мы могли бы преодолеть это?
Обновление PS:
это действительно моя ошибка, перепутанная с class.getResource()
и class.getClassLoader().getResource()
. Один требует косой черты в начале, а другой не разрешает. Как только я удалил косую черту в path
переменной, она работает нормально.
Ответ №1:
Вам нужно указать native image , какие ресурсы включать через -H:IncludeResources=path
. Значением может быть регулярное выражение.
Смотрите документацию для получения более подробной информации:https://github.com/oracle/graal/blob/master/docs/reference-manual/native-image/Resources.md
Комментарии:
1. попробовал это, оно будет работать только для ресурса в classpath
src/main/resources
, не работает, если ресурс находится внутри файла jar.2. @SamYC вы решили проблему? У меня такая же проблема. В моем проекте есть jar зависимостей, который содержит файлы внутри него, и зависимость использует эти файлы. Поскольку они не включены, мой проект не работает.
3. @JordanSilva да, моя проблема решена, это упомянуто в части «PS» в моем вопросе. Я удалил начальную косую черту в переменной path, тогда это работает.