GraalVM native-изображение как прочитать файл ресурсов из Jar

#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, тогда это работает.