WAR中的Java getResourceAsStream JAR

时间:2010-11-26 09:28:58

标签: java deployment 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上运行时遇到同样的错误。

3 个答案:

答案 0 :(得分:3)

使用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();

}

答案 1 :(得分:2)

它应该可以工作,但你需要注意使用正确的类加载器。

答案 2 :(得分:2)

假设你没有把QueryLoader放在另一个JAR中的新手错误,我唯一能看到的问题就是你正在使用File.separator但是从你使用{{ 1}})使用Windows。使用\时,分隔符始终正斜杠(getResourceAsStream),就像您使用的是网址一样。

如果我改变了,我就明白了:

/

当然,如果QueryLoader.class.getClassLoader().getResourceAsStream( "/com/companyname/queries/" + fileName) 包含在QueryLoader包中(以及查询本身),那么您应该这样做:

com.companyname.queries

这很简单。 (据记载,Class.getResourceAsStream使用包含的包的名称限定相对文件名。)