3

Eclipse (実際には IBM RAD 7) で Java EE 5 プロジェクトを WebSphere 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 クラスの 1 つ (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常に null です。リソースが見つかりません。

先頭のスラッシュ ( "/emailTemplates/myEmailTemplate.txt") を試しましたが、それもうまくいきませんでした。

私が間違っていることはありますか?または、これを行うより良い方法はありますか?

ありがとう!

ロブ

4

3 に答える 3

1

EAR ファイルの階層/コンテンツがクラスパスにありません。EAR ファイル内にパッケージ化された Jar ファイルは、構成ごとにモジュールのクラスパスにある場合があります。

そのため、リソースを、「サービス クラス」を含むモジュールのクラスパスにすでにある任意の JAR ファイルにパッケージ化します。

特にリソースを個別に更新する場合は、リソース用に新しい JAR を作成することは不合理ではありません。

于 2012-09-01T18:43:10.530 に答える
0

このコードを使用して、ear からリソースをロードしました。パスはフォルダ/ファイルです。ファイルの場所は resources/folder/file です。

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 に答える
0

JBossでは、そのコードは魅力的に機能します。Thread クラスからのクラス ローダーが、ear ファイルとは異なるクラスパスを持つ場合があります。コーディングしているのと同じクラスを使用してリソースをロードしようとしましたか? 次のようなことを試してください:

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

war または jar (EJB) 内にフォルダーを配置して、問題を絞り込むこともできます。

于 2012-08-31T18:33:21.607 に答える