如何从我的EAR文件中的类加载文本文件?

时间:2012-08-31 16:36:41

标签: java jsf java-ee war ear

我在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"),但这也没有用。

任何想法我做错了什么?或者更好的方法呢?

谢谢!

罗布

3 个答案:

答案 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;
}