簡體   English   中英

WAR中的Java getResourceAsStream JAR

[英]Java getResourceAsStream JAR inside WAR

我有一個Java webapp WAR文件,該文件依賴於WEB-INF \\ lib目錄中的多個jar。 這些JARS之一需要通過執行class.getClassLoader().getResourceAsStream(...)來加載一些配置文件。 但是,InputStream返回null。 當JAR位於WAR中時,采用這種方法是否存在問題? 該應用程序已部署在Tomcat6上。

編輯更多信息:

我正在嘗試從文件中加載SQL查詢,以便可以運行它們。 它們位於Web應用程序的WAR中的單獨DAO jar中,位於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上運行它時遇到相同的錯誤。

設法通過使用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();

}

它應該可以工作,但是您需要注意使用正確的類加載器。

假設您沒有把QueryLoader放在另一個JAR中時犯了新手錯誤,我能看到的唯一問題是您正在使用File.separator卻出現(使用\\ )(使用\\ )。 使用getResourceAsStream ,分隔符始終為正斜杠( / ),就像使用URL一樣。

如果我改變我得到這個:

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

當然,如果QueryLoadercom.companyname.queries包中(以及查詢本身),則應該簡單地執行以下操作:

QueryLoader.class.getResourceAsStream(fileName)

就那么簡單。 (有文件證明Class.getResourceAsStream用包含的包的名稱來限定相對文件名。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM