Java - class.getResource возвращает ноль - PullRequest
45 голосов
/ 29 ноября 2010

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

URL url = ExchangeInterceptor.class.getResource("GeoIP.dat");

Ответы [ 15 ]

43 голосов
/ 23 мая 2012

Для тех, кто использует Intellij Idea : проверьте Настройки -> Компилятор -> Шаблоны ресурсов .

Параметр содержит все расширения, которые следует интерпретировать как ресурсы,Если расширение здесь не соответствует ни одному шаблону, class.getResource вернет значение null для ресурсов, использующих это расширение.

29 голосов
/ 29 ноября 2010

Путь относительно корня пути к классу, и если вы не дадите абсолютный путь, он будет выглядеть в том же пакете, что и используемый вами класс (в данном случае ExchangeInterceptor).Чтобы найти что-то в корне используйте /GeoIP.dat.

17 голосов
/ 23 февраля 2014

Используйте метод getResource класса 'ClassLoader

URL url = ExchangeInterceptor.class.getClassLoader().getResource("GeoIP.dat");
9 голосов
/ 16 октября 2016

Я решил эту проблему, указав resource root на IDEA.

Изначально каталог был таким, а значок представлял собой простой значок папки

До

enter image description here

Right click в каталоге (или только в названии проекта) -> Mark directory As -> Resource Root.

После

after

Перекомпилировать и радоваться: P

4 голосов
/ 21 января 2018

Если вы используете Gradle и IntelliJ, и изменение Resource patterns не сработало, и ваши корни ресурсов установлены правильно ... вы можете попробовать это:

enter image description here

Settings > Build, Execution, Delpoyment > Build Tools > Gradle > Runner > Delegate IDE build/run actions to gradle. (IntelliJ 2017.3.3)

Источник: https://youtrack.jetbrains.com/issue/IDEA-176738#comment=27-2518612

4 голосов
/ 29 ноября 2010

Нет, это правильный путь. Убедитесь, что ресурс находится на вашем пути к классам. Это часто является причиной подобных проблем.

3 голосов
/ 18 января 2018

При использовании IntelliJ я сгенерировал проект как приложение JavaFX, а затем добавил поддержку maven framework. Оказывается, я тогда поместил свой ресурс в src/main/resources и должен был добавить ./ после каждого имени ресурса, которое использовалось в коде.

Также, как указано в предыдущем ответе, работала только загрузка ресурса с помощью classLoader.

Итак, для меня окончательная загрузка URL была выполнена с помощью:

URL url = getClass().getClassLoader().getResource(String.format(".%ssample.fxml", File.separatorChar));

File.separatorChar возвращает / в * nix и \ в windows.

3 голосов
/ 23 апреля 2012

На случай, если у кого-то все еще есть проблемы с пониманием, что:

.getResource () предоставляет вам доступ к локальной папке bin.Это означает, что ваши ресурсы должны быть расположены в YourProject / bin / package /.Корневая папка - YourProject / bin /, и к ней можно обратиться, добавив префикс / к аргументу String, как сказал iirekm.

2 голосов
/ 17 мая 2018

Я столкнулся с подобной проблемой. От Java SE API для getResource (имя строки) :

Если имя начинается с '/' ('\ u002f'), то абсолютное имя ресурса - это часть имени, следующая за '/'.

Итак, я добавил '/' перед своим каталогом: MyClass.class.getResource("/dir_name/").

В вашем случае попробуйте добавить '/' перед именем файла:

URL url = ExchangeInterceptor.class.getResource("/GeoIP.dat");

1 голос
/ 26 июня 2012

Файл должен находиться в пути к классам, например: -

bin / my / package / GeoIP.dat

Префикс / кажется ложным.Следующее будет работать.

URL url = ExchangeInterceptor.class.getResource("my/package/GeoIP.dat");

Я подозреваю, что проблема в том, что у вас нет файла в classpath.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...