倭マン's BLOG

くだらない日々の日記書いてます。 たまにプログラミング関連の記事書いてます。 書いてます。

Maven2 プロジェクトで commons-logging を使う

前回 commons-logging の基礎的な使い方を見ました。

で、Maven2 プロジェクトで実際に使ってみました。 POM ファイルは以下の通り:

<?xml version="1.0"?>
<project>
  ...
  <dependencies>
    <dependency>
      <groupId>commons-logging</groupId>
      <artifactId>commons-logging</artifactId>
      <version>1.1</version>
    </dependency>
  </dependencies>
</project>

このプロジェクトで、次のようなテスト・クラス

import junit.framework.TestCase;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

public class CommonsLoggingTest extends TestCase{

    private static Log LOG = LogFactory.getLog(CommonsLoggingTest.class);
    
    public void test(){
        LOG.trace("trace");
        LOG.debug("debug");
        LOG.info("info");
        LOG.warn("warn");
        LOG.error("error");
        LOG.fatal("fatal");
    }
}

を作成してテストを実行してみると、

log4j:WARN No appenders could be found for logger (CommonsLoggingTest).
log4j:WARN Please initialize the log4j system properly.

ってな警告メッセージが出て、コンソールにログ出力がされませんでした。 警告メッセージからして、log4j に問題があるようです。

どちらも「設定が足りない」的な警告だけど、「ちょっと使いたい」ってときにイチイチ設定ファイルを書くのは面倒*1。 なので、(ロギング・コンポーネントの)設定を書かずにロギングが出来る方法を考えてみましょう(log4j を使う方法は後日)。

log4j を依存性から除外する


common-logging はもともと log4j がなくても動作するコンポーネントなので、log4j に問題があるならそれを使わないようにすれば良いでしょう。 なので、POM ファイルを少々書き換えて、log4j への依存性を消してしまいましょう:

<?xml version="1.0"?>
<project>
  ...
  <dependencies>
    <dependency>
      <groupId>commons-logging</groupId>
      <artifactId>commons-logging</artifactId>
      <version>1.1</version>
      <!-- log4j を読み込まないようにする設定 -->
      <exclusions>
        <exclusion>
          <groupId>log4j</groupId>
          <artifactId>log4j</artifactId>
        </exclusion>
      </exclusions>
    </dependency>
  </dependencies>
</project>

この設定で上記のテストを実行すると

2007/08/30 11:49:47 CommonsLoggingTest test
情報: info
2007/08/30 11:49:47 CommonsLoggingTest test
警告: warn
2007/08/30 11:49:47 CommonsLoggingTest test
致命的: error
2007/08/30 11:49:47 CommonsLoggingTest test
致命的: fatal

と出力されてキチンと動きました。 ちなみにここで使用された Log インターフェースの実装クラスは org.apache.commons.logging.impl.Jdk14Logger です。

commons-logging のバージョンを下げる


commons-logging の以前のバージョンでは、特に設定をせずにログ出力が出来てました。 具体的には1.0.2以前のバージョンです。 バグ・フィックスの観点から、不必要に昔のバージョンのライブラリを使うのは良くないかと思いますが。

ちなみに、commons-logging は最新バージョンの1.1を使用して、log4j は設定の必要がないバージョンの1.1.3を使用しようとすると*2log4j は認識されないようです。 org.apache.commons.logging.impl.Jdk14Logger が使用されました。

java.util.logging を使う


commons-logging に特に思い入れがない方は、J2SE 1.4 (Java SE 4 ?) から追加された標準 API のパッケージ java.util.logging 内のクラスを使うと良いかと思います。

  • 何てったって「標準 API」。
  • ライブラリへの依存性を考えなくて良い。
  • 簡単に使う分には commons-logging と使い方が大して違わない。

などの利点があります。 簡単な使い方は、また機会があれば・・・

ソースコードリーディングから学ぶ Javaの設計と実装

ソースコードリーディングから学ぶ Javaの設計と実装

*1:というよりは、どうやって設定してやるのかいまいちよく分からないってのが正直なところ。 現在模索中。

*2:Maven2 では、ライブラリのバージョンは「間接的な依存性」よりも「直接的な依存性」の方を優先して解決します。 なので、自分のプロジェクトで明示的に log4j 1.1.3 への依存性を書いてやると、commons-logging 1.1 が依存している log4j1.2.12 への依存性は解決されなくなります。