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