我有一个Java webapp WAR文件,该文件依赖于WEB-INF \ lib目录中的多个jar。这些JARS之一需要通过加载一些配置文件class.getClassLoader().getResourceAsStream(...)。但是,InputStream返回null。当JAR位于WAR中时,采用这种方法是否存在问题?该应用程序已部署在Tomcat6上。
class.getClassLoader().getResourceAsStream(...)
编辑更多信息:
我正在尝试从文件中加载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();
}