1

だから、ここに私の問題があります:
私はメッセージ駆動型 Bean X を持っており、X の onMessage() メソッドで Logger を利用したいと考えています。アプリケーション サーバーで Bean のインスタンスが 1 つ実行されていると仮定します。したがって、ejbCreate() で log4j を初期化します。これは、次のようなことをしなければならないことを意味します。

public void ejbCreate() {
    PropertyConfigurator.configure(Classloader.getResourceAsStream("xyz_log4j.properties"));
}

ただし、これは役に立ちません。何をしても、ストリームは常に null として取得されます。他のバージョンを試しました: this.getClass().getStream() と ResourceBundle。

プロパティ ファイルを test.jar に jar し、それを EAR ライブラリ (RAD7 を使用しています) の下に追加すると、manifest.mf に反映されました。

以前にこの問題に直面した人はいますか? はいの場合、どのように解決しましたか?あなたの助けに感謝...

4

3 に答える 3

2

これを JAR ファイル内から取得している場合は、頭文字がありません/

Classloader.getResourceAsStream("/xyz_log4j.properties")

また、プロパティー・ファイルが含まれるディレクトリーに応じて、クラス階層の最上位を基準としたそのディレクトリーへのパスを指定する必要があります。たとえば、このプロパティ ファイルが と同じディレクトリにあるnet.mine.Program場合は、次のようにします。

Classloader.getResourceAsStream("/net/mine/xyz_log4j.properties")

を使用して META-INF ディレクトリから読み取ることができるとは思いませんがgetResourceAsStream()、試したことがないので、おそらくそれを行う方法があります。

于 2009-06-10T13:11:56.133 に答える
1

EJBcreateメソッドでlog4jを構成することはお勧めしません。J2EE仕様に従って、コンテナの気まぐれで複数のEJBeanをアクティブ化/パッシベーションできます。そのため、log4jを複数回構成してしまう可能性があります。1回だけ呼び出されることが保証されているスタートアップBeanの使用をお勧めします。

于 2009-06-11T00:06:03.817 に答える
1

クラス名をロードにハードコーディングしてみてください。

<name of your class>.class.getResourceAsStream(fileName);

または、 SLF4Jを調べることもできます。LOG4Jの上に乗ることができるファサードです。API はほとんど同じ (作成者は同じだと思います) で、SLF4J は明示的な初期化呼び出しを必要としないため、少し単純化されています。

于 2009-06-10T13:24:43.783 に答える