Загрузка ресурсов в Java не работает должным образом - PullRequest
0 голосов
/ 08 марта 2012

Это хорошо известная проблема загрузки ресурсов из файла JAR. Это не первый раз, когда я пытался это сделать, но теперь это не работает так, как я ожидаю.

Обычно я пытаюсь загрузить ресурсы с помощью this.getClass.getResource("foo.png") или getResourceAsStream(), и это работает. Однако сейчас это не так. Ресурс всегда нулевой.

Если я позволю System.out.println(this.getClass.getResource("")) напечатать мне путь (из затмения), он покажет /path/to/eclipseproject/package/structure/. Запустив это из банки, он просто показывает rsrc:package/structure

Если я правильно помню, это должно напечатать путь к банке. Кроме того, я думал, что это напечатало бы структуру пакета в обоих случаях. Я что-то не так делаю?

Ответы [ 5 ]

2 голосов
/ 08 марта 2012

Вот в чем дело ...

При извлечении файла из Jar используйте:

this.getClass.getResource("/foo.png")

При запуске из запускаемого Jar-файла для ссылки на внешний файл в пути к папке Jar:

this.getClass.getResource("foo.png")
// When running this from Eclipse, it would refer to files in project root!

У меня есть код на нижнем уровне, определяющий, откуда я бегу, чтобы определить правильный путь.

0 голосов
/ 08 декабря 2012

Этот ответ предоставляет объяснение того, как загрузить ресурсы класса из файлов JAR, даже если класс отсутствует в файле JAR и отсутствует в Class-Path, указанном в манифесте файла JAR.Также есть ссылки на код.

0 голосов
/ 08 марта 2012

Проверьте URLClassLoader для всех подробностей, но это действительно зависит от того, пытаетесь ли вы получить доступ к ресурсу в банке,

  • с использованием класса, загруженного в тот же jar, в этом случае ваш файл 'root' является корнем jar

  • с использованием класса, загруженного вне jar (ваш случай затмения), где корнем является ваш «рабочий каталог»

Чтобы получить доступ к ресурсам внутри банки снаружи, вы должны использовать что-то вроде

URL url = new URL( "jar", "", "file:" + jar.getCanonicalPath( ) + "!/" + localPathResource ); url.openStream(...)

0 голосов
/ 08 марта 2012

Если вы не добавите путь к ресурсам с помощью '/', Class.getResource () будет искать ресурс в пакете классов.Например: tld.domain.Foo.class.getResource ("Bar.txt") будет искать tld / domain / Bar.txt

0 голосов
/ 08 марта 2012

Получаете ли вы путь, который вам нужен?

this.getClass().getClassLoader().getResource("<your class name>.class").getPath();

См. Также этот вопрос для получения дополнительной информации по этому вопросу.

...