我有一个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上运行时遇到同样的错误。
答案 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
使用包含的包的名称限定相对文件名。)