概要
log4jを用いてログ出力をしているプログラムをjarファイルにまとめたところ、log4jの設定ファイルであるlog4j.xmlがうまく読み込まれなくなりました。
プロジェクトの構成は、こんな感じです。
├ src
└ foo
└ foo.java <= メインのプログラム
└ resources
└ log4j.xml <= log4jの設定ファイル
失敗例
メインのプログラムのコンストラクタの中で、以下のように設定ファイルを読み込みました。
foo.java
import org.apache.log4j.xml.DOMConfigurator;
public class foo {
public foo () {
DOMConfigurator.configure("log4j.xml");
}
}
ファイル名log4j.xml
を指定することで、Eclipse上でテストしたときはうまく読み込まれるものの、このプロジェクトをjarファイル化して動かしたときには、ファイルが見つからない旨のエラーが出て失敗します。
失敗した原因
プロジェクトをjarファイルにしてほかのプログラムから呼び出したときに、そのプログラムの起動ディレクトリにファイルlog4j.xml
がないか探してしまうため、うまく見つからなかったようです。
そのため、ファイル名のみを指定するのではなく、ファイルまでの絶対パスを指定するようにします。
解決策
コンストラクタを以下のように書き換えることで絶対パス指定ができるようになり、jarファイルにプロジェクトをまとめてもうまく設定ファイルが読み込まれるようになります。
foo.java
public foo () {
ClassLoader loader = Thread.currentThread().getContextClassLoader();
DOMConfigurator.configure(loader.getResource("log4j.xml"));
}