我在Eclipse上运行了一个Java EE 5项目(实际上是IBM RAD 7)。
工作空间项目的布局如下:
webapp <-- produces a WAR file
webappEAR <-- produces the EAR file
webappEJB <-- holds the Service and DAO classes
webappJPA <-- holds the domain/entity classes
webappTests <-- holds the JUnit tests
在我的一个Service类中(在webappEJB项目中)我需要加载一个文本文件作为资源。
我将文本文件放在文件夹中:
webappEAR/emailTemplates/myEmailTemplate.txt
所以它出现在EAR文件中:
webappEAR.EAR
/emailTemplates/myEmailTemplate.txt
在我的服务类中,这是我加载它的方式:
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
InputStream input = classLoader.getResourceAsStream("emailTemplates/myEmailTemplate.txt");
BufferedReader br = new BufferedReader(new InputStreamReader(input));
/* and so on */
问题是input
始终为空 - 它无法找到资源。
我尝试了一个前导斜杠("/emailTemplates/myEmailTemplate.txt"
),但这也没有用。
任何想法我做错了什么?或者更好的方法呢?
谢谢!
罗布
答案 0 :(得分:1)
EAR文件层次结构/内容不在您的类路径中;根据配置,打包在EAR文件中的Jar文件可能位于模块的类路径中。
因此,将资源打包到已包含“服务类”的模块的类路径中的任何JAR文件中。
为资源创建新的JAR并非没有道理,特别是如果您要独立更新它们。
答案 1 :(得分:0)
该代码似乎没问题,在JBoss中可以充当魅力。可能发生的是,Thread类的类加载器具有与ear文件不同的类路径。 您是否尝试使用与编码相同的类来加载资源? 尝试这样的事情:
ClassInsideEar.class.getResourceAsStream("/emailTemplates/myEmailTemplate.txt");
您也可以尝试将文件夹放在war或jar(EJB)中以缩小问题范围。
答案 2 :(得分:0)
我使用此代码从耳朵加载资源。 路径是文件夹/文件。文件的位置是资源/文件夹/文件。
private InputStream loadContent(String path) {
final String resourceName = path;
final ClassLoader classLoader = getClass().getClassLoader();
InputStream stream = null;
try {
stream = AccessController.doPrivileged(
new PrivilegedExceptionAction<InputStream>() {
public InputStream run() throws IOException {
InputStream is = null;
URL url = classLoader.getResource(resourceName);
if (url != null) {
URLConnection connection = url.openConnection();
if (connection != null) {
connection.setUseCaches(false);
is = connection.getInputStream();
}
}
return is;
}
});
} catch (PrivilegedActionException e) {
e.printStackTrace();
}
return stream;
}