2013-11-26 3 views
1

Добрый день всем.Groovy ресурс из classpath не загружен

Я использую spock framework для тестирования в моем отличном проекте (IDE - Intellij Idea 12.6). Моя спецификация Спока класс передача файла в Groovy объект для обработки (этот файл находится в пути к классам наверняка), но когда я пытаюсь получить то этот файл таким образом

def resource = getClass().getClassloader().getResourceAsStream(filepath) 
    assert resource != null : "No input stream found for path ${filepath}" 
    def rootNode = new XmlParser().parse(resource) 

Тогда resource == null.

Я пробовал отладку и в Expression Evaluation windows этот код getClass().getResource(fileName) возвращает ресурс.

Я попытался проверить, какой класс загрузчик используется в первом случае (в классе с кодом) и во втором случае (окно оценки выражений).

В первом случае загрузчик классов был [email protected], но в окне оценки выражений класс classloader был [email protected] Я полагаю, что это причина, по которой мой ресурс был нулевым.

Может ли кто-нибудь объяснить мне, что я делаю неправильно, и как я могу загрузить этот файл ресурсов?

UPDATE:

Изменен файл путь ресурс был разобран. Когда filepath - полный путь к файлу это работает, но если filepath только имя файл и этот файл в пути к классам затем resource == null

UPDATE2:

Измените файл путь ресурса загружен, очистить зависимости немного и все я думаю, вчера был не мой день.

+1

Передача только имени файла работает только тогда, когда ресурс находится в том же пакете, что и класс, на который ссылается 'getClass()', и только тогда, когда используется 'Class # getResourceStream' (а не' ClassLoader # getResourceStream'). –

ответ

6

Проблема, скорее всего, не связана с Споком. Трудно сказать с расстояния, что вызывает его, но самый безопасный способ прочитать ресурс - getClass().getClassLoader().getResourceAsStream() или Thread.currentThread().getContextClassLoader().getResourceAsStream(), в зависимости от окружающей среды.

Не уверен, что делает Groovy, когда вы делаете new File(resource), так как нет File(URL) конструктор (только File(URI) конструктор). В любом случае, по возможности следует избегать получения File из пути к классу.

+0

Пробовал использовать getClass(). GetClassLoader(). GetResourceAsStream() и Thread.currentThread(). GetContextClassLoader(). Метод getResourceAsStream(), результат - тот же ресурс, что и null. Можете ли вы объяснить, почему следует избегать получения файла из пути класса? В моем случае мне нужно прочитать xml-файл, а затем обработать его – artjomka

+1

Обратите внимание, что аргумент, ожидаемый этими методами, отличается от того, что 'getClass(). GetResource()' ожидает (проверьте документацию). Для проблем, с которыми вы можете столкнуться, когда вы получаете «Файл» из пути к классу, см. Https://weblogs.java.net/blog/kohsuke/archive/2007/04/how_to_convert.html#comment-825410 (комментарий и основная статья). Для обработки XML-файла «InputStream» обычно работает нормально. –

+0

Да, я полагаю, что Спок не связан с этой проблемой, должно быть что-то с загрузчиками классов ... – artjomka

2

Это, вероятно, связано с тем, что Groovy может по-разному интерпретировать класс объекта, что, по вашему мнению, происходит. Смотрите следующий другой пункт StackOverflow:

Why does groovy .class return a different value than .getClass()

Когда класс не так, то ClassLoader вполне может с помощью начального загрузчика и getClassLoader возвращает нуль.

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

def resource = getClass().getClassloader().getResourceAsStream(filepath) 

указать фактический класс, используя заявление как

def resource = MyClass.class.getClassLoader().getResourceAsStream(filePath) 

работал для меня в почти одинаковых обстоятельствах.

Смежные вопросы