2013-09-26 8 views
24

Моя структура каталогов проекта (в Eclipse):ClassLoader getResourceAsStream возвращает нуль

MyProject/ 
    src/  --> "source directory" on Eclipse's 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? Что-то другое? Заранее спасибо!

ответ

38

Если это в одном пакете использовать

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 of ClassLoader#getResource(String) и javadoc of Class#getResource(String).

7

Если вы работаете с Maven, добавьте следующие строки под BUILD tag. Вы получаете эту ошибку при запуске 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> 

Удачи!

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