Ответ 1
getResourceAsStream()
использует CLASSPATH, и как таковой он будет загружаться из всех ваших классов, а не из ваших исходных файлов.
Я подозреваю, что вам нужно скопировать XML в тот же каталог, что и ваш .class файл.
Не знаю, как это возможно. Я перечитываю getResourceAsStream и всегда возвращает null.
InputStream source = this.getClass().getResourceAsStream("test.xml");
Рядом с test.java в Finder (с использованием OS X и Eclipse) находится test.xml
Я могу открыть его в TextWrangler и просмотреть его как существующий с данными внутри.
Это тест Junit, если он имеет какое-либо значение. Я пошел и посмотрел на существующие тесты Junit в нашей системе, и я использую его точно так же, как рабочий пример (как там, где находится файл, и сам код).
Какая небольшая разница может быть препятствием, я предполагаю, что getClass() вернет правильный путь?
Спасибо!
getResourceAsStream()
использует CLASSPATH, и как таковой он будет загружаться из всех ваших классов, а не из ваших исходных файлов.
Я подозреваю, что вам нужно скопировать XML в тот же каталог, что и ваш .class файл.
Он не находит ресурс в пути к классам. Если вы используете junit и maven, убедитесь, что ресурсы скопированы в целевые/тестовые классы, добавив директиву <include>
в разделе <testResource>
Вы также можете узнать расположение своего класса в файловой системе, используя
this.getClass().getResource(".")
и проверьте, есть ли ресурс
У меня всегда есть проблема с этим методом. Вот 2 ссылки, которые могут быть полезны:
Я всегда экспериментирую с добавлением "/" в начале или "./".
Из моего опыта лучший метод использует FileInputStream. Следует помнить только одно (при использовании FileInputStream с Eclipse), с настройками по умолчанию, в вашем рабочем каталоге установлен корень проектов. Вы всегда можете проверить, где находится ваш текущий каталог (и какие относительные пути вам нужны), используя этот фрагмент кода.
Если вы используете Maven, добавьте эту часть в свой pom.xml
<build>
<testResources>
<testResource>
<directory>${project.basedir}/src/test/resources</directory>
</testResource>
</testResources>
</build>
Ваш test.xml
и другие файлы ресурсов должны быть расположены в src/test/resources
Предполагая, что test.xml
находится прямо под вашей корневой исходной папкой test
, выполните следующие действия: -
InputStream source = this.getClass().getClassLoader().getResourceAsStream("test.xml");
Попробуйте MyClass.getResourceAsStream().
Также попробуйте поместить test.xml в свой путь к классам. Например, в веб-проекте Eclipse поместите text.xml в webcontent/WEB-INF/classes
Из API Java:
Найдите ресурс указанного имени из пути поиска, используемого для загрузки классов. Этот метод находит ресурс через загрузчик системного класса
Таким образом, синтаксис будет, например, быть: ClassLoader.getSystemResource( "test.xml" ) ToString();.
Работает как шарм!
Я потратил много времени на эту проблему, и мне не хватало следующей конфигурации: Щелкните правой кнопкой мыши проект eclipse и выберите Свойства → Путь сборки Java → Источник и отредактируйте строку Включено и добавить *.properties (*.fileExtension)
У меня была эта проблема с классом Spring. System.class.getResourceAsStream(...)
работал в модульных тестах, но не в Tomcat, Thread.currentThread().getContextClassLoader().getResourceAsStream(...)
работал в Tomcat, но не в модульных тестах.
Улично я пошел с:
ClassUtils.getDefaultClassLoader()
.getResourceAsStream("com/example/mail/templates/invoice-past-due.html"))
Я также обнаружил, что, как только я это сделал, мне не нужно было начинать путь с косой черты.
Вам нужно поместить копию своего ресурсного файла в тестовые ресурсы, в моем примере это файл шрифта:
Затем вызовите следующий из теста jUnit:
public static InputStream getFontAsStream() throws IOException {
return Thread.currentThread().getContextClassLoader()
.getResourceAsStream("fonts/" + "FreeSans.ttf");
}
Добавьте папку с вашими файлами ресурсов в исходные папки eclipse. Затем файл должен быть автоматически помещен в каталог bin.