КлассLoader getResourceAsStream возвращает значение null
Структура моего проекта (в Eclipse):
MyProject/
src/ --> "source directory" on Eclipse classpath/buildpath
com.me.myapp
Driver
myconfig.txt
В Driver
у меня есть следующий код:
public class Driver {
public static void main(String[] args) {
InputStream is = ClassLoader.getSystemClassLoader.getResourceAsStream("myconfig.txt");
if(is == null)
System.out.println("input stream is null");
else
System.out.println("input stream is NOT null :-)");
}
}
Когда я запускаю это, я получаю следующий вывод консоли:
input stream is null
Почему? Я разместил myconfig.txt
в неправильном месте? Я неправильно использую API ClassLoader? Что-то другое? Спасибо заранее!
Ответы
Ответ 1
Если в одном и том же пакете используйте
InputStream is = Driver.class.getResourceAsStream("myconfig.txt");
Способ, которым вы располагаете
InputStream is = ClassLoader.getSystemClassLoader().getResourceAsStream("myconfig.txt");
Он ищет файл в корневом пути. Вы можете использовать
InputStream is = ClassLoader.getSystemClassLoader().getResourceAsStream("com/me/myapp/myconfig.txt");
Правила поиска описаны в javadoc ClassLoader#getResource(String)
и javadoc Class#getResource(String)
.
Ответ 2
Если вы работаете с Maven, добавьте следующие строки в тег BUILD. Вы получаете эту ошибку при запуске webapp на сервере, но ссылки на ресурсы на сервере отсутствуют.
Итак, добавьте это в свой POM.xml и увидите волшебство.
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
<includes>
<include>fileName.txt</include>
</includes>
</resource>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
<includes>
<include>fileName.wsdl</include>
</includes>
</resource>
</resources>
Получайте удовольствие.!!!