一尘不染

WAR中的Java getResourceAsStream JAR

tomcat

我有一个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上运行它时遇到相同的错误。


阅读 225

收藏
2020-06-16

共1个答案

一尘不染

设法通过使用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();

}

2020-06-16