Java - class.getResource возвращает null
Я использую следующее, чтобы получить URL этого конкретного файла, но он возвращает null. Кто-нибудь имеет какие-либо предложения относительно проблемы или альтернативный способ сделать это?
URL url = ExchangeInterceptor.class.getResource("GeoIP.dat");
Ответы
Ответ 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 As
→ Resource 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