Java загрузочные ресурсы Class.class.getResource vs <classname>.class.getResource - PullRequest
1 голос
/ 26 июля 2011

В чем разница между двумя?

мои файлы ресурсов упакованы в пакет корневого уровня.И вызов Class.class.getResource ("/ rec.txt"), похоже, работал в конкретном случае, который я тестировал.Но когда я попытался использовать этот jar-файл в качестве зависимости в более крупной среде (hadoop), это не сработало (вернул null)Но изменение «Класса» на любой конкретный класс в коде исправило это.Может ли кто-нибудь пролить немного света.

Ответы [ 2 ]

3 голосов
/ 26 июля 2011

Причина, по которой это происходит, в том, что работает метод getResource.По сути, он делегирует вызов classLoader <classname>, как указано в вашем вопросе.

Объект Class, вероятно, был загружен загрузчиком загрузчиков классов в корпоративном приложении, тогда как ваш класс <classname> был загружендругой загрузчик классов.

0 голосов
/ 26 июля 2011

Class.getResource () разрешает относительные пути, добавляя его к пути класса, для которого вы вызвали getResource (). Путь является относительным, если он не начинается с "/", в этом случае он разрешается относительно корня пути к классам. ClassLoader.getResource () разрешает все пути как абсолютные, но вы не должны добавлять "/" к пути. Это все, что нужно, правда. Если какой-либо метод возвращает ноль, это означает, что ресурс не существует.

Редактировать: О, прости. Я недостаточно внимательно прочитал ваш вопрос и пропустил часть «Класс против класса». Различие, которое вы ищете, заключается в том, что загрузка ресурса через делегатов класса в связанный с ним ClassLoader. Я не знаю много о том, как Hadoop настраивает свои ClassLoaders, но класс java.lang.Class будет загружен загрузчиком ClassLoader, и почти наверняка, загрузчик ClassLoader не имеет ни одного из ваших jar-файлов на своем пути к классам, поэтому он не сможет найти какие-либо ресурсы, определенные в нем. Однако ваш собственный класс должен быть загружен ClassLoader, который имеет доступ к вашим jar-файлам и, следовательно, сможет загружать ваш ресурс.

...