commons-logging を SLF4J に置き換える

問題

commons-logging を使用している既存のコードを変更することなく SLF4J を使うために、jcl-over-slf4j がある*1。これは Commons Logging の一部を含んでいるため、commons-logging.jar はクラスパスから外す必要がある。

しかし、Maven2 を使っていて Spring Framework など外部のライブラリが Commons Logging に依存している場合、commons-logging も勝手に入ってしまい、競合してしまう。これを防ぐには commons-logging に依存している全てのライブラリの設定に を書けばいいのだけど、面倒でやってられない。

対処方法

こちらのサイトにあるように、commons-logging の設定を明示的に書いて、空のファイルを参照させればいい。

http://day-to-day-stuff.blogspot.com/2007/10/announcement-version-99-does-not-exist.html

上記のサイトではリポジトリを作って行っているが、リポジトリを作れない/面倒くさい場合は jar だけを用意して、ローカルにインストールしておく。

Windowsコマンドプロンプトなら、ファイルをダウンロードしたフォルダに移動し、以下のようにする(bashとかなら ^ ではなく \)。

mvn -Dfile=commons-logging-99.0-does-not-exist.jar -Dpackaging=jar ^
 -DgroupId=commons-logging -DartifactId=commons-logging ^
 -Dversion=99.0-does-not-exist -DgeneratePom=true -DcreateChecksum=true ^
 install:install-file

あとは、pom.xml で以下のように指定すれば良い。exclusions を書く必要はない。

<dependency>
  <groupId>commons-logging</groupId>
  <artifactId>commons-logging</artifactId>
  <version>99.0-does-not-exist</version>
</dependency>

*1:ちなみに、jcl-over-slf4j は Commons Logging 1.1.1 用、jcl104-over-slf4j は Commons Logging 1.0.4 用