Подтвердить что ты не робот

Java - class.getResource возвращает null

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

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

Ответ 1

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

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

Ответ 2

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

Ответ 3

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

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

Ответ 4

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

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

До

enter image description here

Right click по каталогу (или просто по имени проекта) → Mark directory AsResource Root.

После

after

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

Ответ 5

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

Ответ 6

Если вы используете 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

Ответ 7

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

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

Ответ 8

Где вы разместили этот файл GeoIP.dat? В том же пакете, что и ExchangeInterceptor, или в пакете "root". Если в том же пакете ваш код в порядке, если в корневом - добавьте префикс '/'.

Может быть, вы используете M2Eclipse? При неправильной настройке это может также привести к таким проблемам. Другой причиной таких проблем могут быть: неправильно сконфигурированные загрузчики классов, неправильно сконфигурированные OSGi,...

Ответ 9

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

бен/мой/пакет/GeoIP.dat

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

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

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

Ответ 10

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

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

Поэтому для меня окончательная загрузка URL-адресов была выполнена с использованием:

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

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

Ответ 11

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

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

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

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

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

Ответ 12

Сначала вам нужно убедиться, что вы обращаетесь к правильному файлу по правильному пути. Вы можете проверить это с помощью getClass(). GetResource ( "GeoIP.dat" ). GetAbsolutePath().

Во-вторых, спецификатор пути чувствителен к регистру, поэтому убедитесь, что ваш файл не назван "geoIP.dat" или "GeoIP.DAT".

Ответ 13

В случае затмения.

Просто намек. Ваш код может быть правильным, но ваша конфигурация jre отсутствует. Я столкнулся с той же ошибкой, ничего не помогло, пока я не проверил настройки затмения.

Убедитесь, что вы правильно установили среду выполнения.

Preferences -> Java -> Installed JREs -> use "jdk..." as compatible JRE