Java getResourceAsStream JAR внутри WAR - PullRequest
4 голосов
/ 26 ноября 2010

У меня есть файл WAR веб-приложения Java, который зависит от нескольких jar-файлов в его каталоге WEB-INF \ lib. Один из этих JARS должен загрузить некоторые файлы конфигурации, выполнив class.getClassLoader().getResourceAsStream(...). Однако InputStream возобновляет нулевое значение. Есть ли проблема с этим подходом, когда JAR находится внутри WAR? Приложение развернуто на Tomcat6.

РЕДАКТИРОВАТЬ БОЛЬШЕ ИНФОРМАЦИИ:

Я пытаюсь загрузить запросы SQL из файлов, чтобы я мог их запустить. Они расположены в отдельном банке DAO в WAR-файле веб-приложения в разделе WEB-INF / lib

mywebapp.war
        -- WEB-INF
          -- lib
             -- mydao.jar
               ---- com/companyname/queries
                   -- query1.sql
                   -- query2.sql
                   -- query3.sql
                   ...

код, используемый для загрузки классов

public class QueryLoader {

 private static final Logger LOGGER = Logger.getLogger(QueryLoader.class.getName());

public String loadQuery(String fileName) {
  final String newline = "\n";

  BufferedReader reader = new BufferedReader(new InputStreamReader(         
        QueryLoader.class.getClassLoader().getResourceAsStream(
              "/com/companyname/queries/" + fileName)));
  StringBuilder sb = new StringBuilder();
  String line;
  try {
     while ((line = reader.readLine()) != null) {
        sb.append(line);
        sb.append(newline);
     }
  } catch (IOException e) {
     LOGGER.error(e);
  }

Я также попытался изменить строку getResourceAsStream на

Thread.currentThread().getContextClassLoader().getResourceAsStream(

без успеха.

Моя среда разработки - MS Windows Vista, но я сталкиваюсь с той же ошибкой при запуске ее в этой среде и в Ubuntu.

Ответы [ 3 ]

3 голосов
/ 26 ноября 2010

удалось заставить его работать, используя вместо этого загрузчик ресурсов Spring

public String loadQuery(String fileName) {
  final String newline = "\n";

  ApplicationContext ctx = new ClassPathXmlApplicationContext();
  Resource res = ctx.getResource("classpath:/com/msi/queries/" + fileName);
  BufferedReader reader;
  StringBuilder sb = new StringBuilder();
  try {
     reader = new BufferedReader(new InputStreamReader(res.getInputStream()));
     String line;

     while ((line = reader.readLine()) != null) {
        sb.append(line);
        sb.append(newline);
     }
  } catch (IOException e) {
     LOGGER.error(e);
  }

  return sb.toString();

}

2 голосов
/ 26 ноября 2010

Предполагая, что вы не совершаете ошибку новичка, помещая QueryLoader в другой JAR-файл, единственная проблема, которую я вижу, состоит в том, что вы используете File.separator, но все же кажется (из-за использования \) используя Windows. При использовании getResourceAsStream в качестве разделителя используется всегда с косой чертой (/), как если бы вы использовали URL.

Если я изменю это, я получу это:

QueryLoader.class.getClassLoader().getResourceAsStream(
          "/com/companyname/queries/" + fileName)

Конечно, если QueryLoader находится в пакете com.companyname.queries (вместе с самими запросами), то вы должны просто сделать это:

QueryLoader.class.getResourceAsStream(fileName)

Все просто. (Документально подтверждено, что Class.getResourceAsStream квалифицирует относительные имена файлов с именем содержащего пакет.)

2 голосов
/ 26 ноября 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...