[英]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)
當然,如果QueryLoader
在com.companyname.queries
包中(以及查詢本身),則應該簡單地執行以下操作:
QueryLoader.class.getResourceAsStream(fileName)
就那么簡單。 (有文件證明Class.getResourceAsStream
用包含的包的名稱來限定相對文件名。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.