Я работаю над проектом Java и у меня есть небольшая проблема.
Мой проект в настоящее время работает и работает правильно, когда я запускаю его из IntelliJ.Для работы ему нужны некоторые ресурсы, такие как изображения или TXT-файлы.
Это мой текущий файл конфигурация
Моя проблема:
Когда яэкспортировать проект в исполняемый jar-файл, он не работает.Причина в том, что он не может найти ресурсы.
Однако я использовал Class.class.getResourcesAsStream(String)
.
Самое любопытное, что ресурсы находятся в банке и правильно размещены ...
Кто-нибудь может нам помочь?
Спасибо за вашу помощь.
Мой код
File f = new File(Loader.class.getResource("/xsbfiles").getFile());
System.out.println(f.getAbsolutePath() +": exists ? " + f.exists());
System.out.println(f.getAbsolutePath());
Запуск приложения из Intellij
/Users/gael/IdeaProjects/Sockoban/out/production/Sokoban/xsbfiles: exists ? true
/Users/gael/IdeaProjects/Sockoban/out/production/Sokoban/xsbfiles
Opening /Users/gael/IdeaProjects/Sockoban/out/production/Sokoban/xsbfiles/MicroCosmos.txt
Successful Opening
Запуск файла JAR с терминала
/Users/gael/IdeaProjects/Sockoban/out/artifacts/Sokoban/file:/Users/gael/IdeaProjects/Sockoban/out/artifacts/Sokoban/Sokoban.jar!/xsbfiles: exists ? false
/Users/gael/IdeaProjects/Sockoban/out/artifacts/Sokoban/file:/Users/gael/IdeaProjects/Sockoban/out/artifacts/Sokoban/Sokoban.jar!/xsbfiles
No xsbfile found
Редактировать:
Наконец, я решил свою проблему с помощью BufferedReader, как в примере:
BufferedReader reader = new BufferedReader(
new InputStreamReader(MyClass.class.getResourceAsStream("/xsbfiles/MicroCosmos.txt")));
Это хорошее решение для загрузки одного файла.Однако мне нужно прочитать все файлы в папке с именем xsbfiles ...
Я искал в разных источниках и нашел похожий вопрос .
Ответ предлагает использовать «хак» для просмотра списка файлов, содержащихся в папке.Вот пример кода Бориса Паука:
public static List<URL> getResources(final String path) throws IOException {
final ClassLoader loader = Thread.currentThread().getContextClassLoader();
try (
final InputStream is = loader.getResourceAsStream(path);
final InputStreamReader isr = new InputStreamReader(is, StandardCharsets.UTF_8);
final BufferedReader br = new BufferedReader(isr)) {
return br.lines()
.map(l -> path + "/" + l)
.map(r -> loader.getResource(r))
.collect(toList());
}
}
Чтобы хорошо понять код, я запустил его в своей IDE и в терминале.Кажется, он работает правильно на моей IDE, но не с jar.
Что я сделал, что не работает?