3

我在 WebSphere 7 上运行的 Eclipse(实际上是 IBM RAD 7)中有一个 Java EE 5 项目。

工作区项目的布局如下:

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

在我的一个服务类中(在 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"),但这也不起作用。

任何想法我做错了什么?或者更好的方法来做到这一点?

谢谢!

4

3 回答 3

1

EAR 文件层次结构/内容不在您的类路径中;根据配置,打包在 EAR 文件中的 Jar 文件可能位于模块的类路径中。

因此,将资源打包到包含“服务类”的模块的类路径上的任何 JAR 文件中。

为资源创建一个新的 JAR 并不是不合理的,尤其是当您要独立更新它们时。

于 2012-09-01T18:43:10.530 回答
0

该代码似乎还可以,在 JBoss 中可以作为一种魅力。Thread 类的类加载器可能具有与 ear 文件不同的类路径。您是否尝试使用您正在编码的同一类来加载资源?尝试这样的事情:

ClassInsideEar.class.getResourceAsStream("/emailTemplates/myEmailTemplate.txt");

您也可以尝试将文件夹放在 war 或 jar (EJB) 中以缩小问题范围。

于 2012-08-31T18:33:21.607 回答
0

我使用此代码从 ear 加载资源。路径是文件夹/文件。文件的位置是资源/文件夹/文件。

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;
}
于 2015-09-22T06:56:44.627 回答