tanamonの稀に良く書く日記

KEEP CALM AND DRINK BEER

Maven2でlog4j 1.2.15を使用する場合の注意

見事にハマったので、メモを残しておきます。


Log4jの最新版(1.2.15)からはJMS,JMX,JavaMailを使用するようになったらしく、これらはライセンスの関係でMaven2のセントラルリポジトリには登録されていないものになります。
そのため、使用するにはローカルリポジトリにこれらのライブラリを手動で登録する必要があります。


僕はあきらめて1.2.14を使用することにして回避したのですが、もし1.2.15を使用したいのであれば2008-07-16を参考にするとよいと思います。


気づいたのがちょうどm2eclipseを入れた直後だったので、エラーログと原因をうまく結びつけられず、m2eclipseのエラーかと思って変な方向に考えがいってしまった。で、後でよくよく確認したらmvnコマンドでもエラーがでていました。


それにしても、1.2.14と1.2.15の違いでライブラリの依存性が変わるというのはずいぶん乱暴なバージョンアップじゃないかと思う。もし仮に、

    <dependency>
    	<groupId>log4j</groupId>
    	<artifactId>log4j</artifactId>
    	<version>[1.2,)</version>
    </dependency>

このような書き方をした場合、ある日突然ビルドが通らなくなってしまう。やはり、以前に書いたとおり、自動バージョンアップは業務で使うには危険なものだと思う。


最後に、この問題が起こった場合に出るエラーメッセージを載せておきます。

m2eclipseが出力するエラー

Missing indirectly referenced artifact com.sun.jdmk:jmxtools:jar:1.2.1:compile
Missing indirectly referenced artifact com.sun.jmx:jmxri:jar:1.2.1:compile
Missing indirectly referenced artifact javax.jms:jms:jar:1.1:compile
Project 'MavenTest' is missing required library: 'C:\Documents and Settings\Administrator\.m2\repository\javax\jms\jms\1.1\jms-1.1.jar'
The project cannot be built until build path errors are resolved

mvnコマンド実行時のエラー

[INFO] ------------------------------------------------------------------------
[ERROR] BUILD ERROR
[INFO] ------------------------------------------------------------------------
[INFO] Failed to resolve artifact.

Missing:
----------
1) javax.jms:jms:jar:1.1

  Try downloading the file manually from:
      http://java.sun.com/products/jms/docs.html

  Then, install it using the command:
      mvn install:install-file -DgroupId=javax.jms -DartifactId=jms -Dversion=1.1 -Dpackaging=jar -Dfile=/path/to/file

  Alternatively, if you host your own repository you can deploy the file there:
      mvn deploy:deploy-file -DgroupId=javax.jms -DartifactId=jms -Dversion=1.1 -Dpackaging=jar -Dfile=/path/to/file -Durl=[url] -DrepositoryId=[id]

  Path to dependency:
        1) example.helloworld:WicketHelloWorld:war:0.0.1-SNAPSHOT
        2) log4j:log4j:jar:1.2.15
        3) javax.jms:jms:jar:1.1

2) com.sun.jdmk:jmxtools:jar:1.2.1

  Try downloading the file manually from:
      http://java.sun.com/products/JavaManagement/download.html

  Then, install it using the command:
      mvn install:install-file -DgroupId=com.sun.jdmk -DartifactId=jmxtools -Dversion=1.2.1 -Dpackaging=jar -Dfile=/path/to/file

  Alternatively, if you host your own repository you can deploy the file there:
      mvn deploy:deploy-file -DgroupId=com.sun.jdmk -DartifactId=jmxtools -Dversion=1.2.1 -Dpackaging=jar -Dfile=/path/to/file -Durl=[url] -Drepositor
yId=[id]

  Path to dependency:
        1) example.helloworld:WicketHelloWorld:war:0.0.1-SNAPSHOT
        2) log4j:log4j:jar:1.2.15
        3) com.sun.jdmk:jmxtools:jar:1.2.1

3) com.sun.jmx:jmxri:jar:1.2.1

  Try downloading the file manually from the project website.

  Then, install it using the command:
      mvn install:install-file -DgroupId=com.sun.jmx -DartifactId=jmxri -Dversion=1.2.1 -Dpackaging=jar -Dfile=/path/to/file

  Alternatively, if you host your own repository you can deploy the file there:
      mvn deploy:deploy-file -DgroupId=com.sun.jmx -DartifactId=jmxri -Dversion=1.2.1 -Dpackaging=jar -Dfile=/path/to/file -Durl=[url] -DrepositoryId=
[id]

  Path to dependency:
        1) example.helloworld:WicketHelloWorld:war:0.0.1-SNAPSHOT
        2) log4j:log4j:jar:1.2.15
        3) com.sun.jmx:jmxri:jar:1.2.1

----------
3 required artifacts are missing.


追記:
Spring Rooで自動生成されたpom.xmlでは、以下のようにexclusion指定してあった。
実行時に使わないことが明らかであるならば、こういうやり方もありですな。

<dependency>
	<groupId>log4j</groupId>
	<artifactId>log4j</artifactId>
	<version>1.2.15</version>
	<!-- Exclusions only required for version 1.2.15 of log4j -->
	<exclusions>
		<exclusion>
			<groupId>javax.mail</groupId>
			<artifactId>mail</artifactId>
		</exclusion>
		<exclusion>
			<groupId>javax.jms</groupId>
			<artifactId>jms</artifactId>
		</exclusion>
		<exclusion>
			<groupId>com.sun.jdmk</groupId>
			<artifactId>jmxtools</artifactId>
		</exclusion>
		<exclusion>
			<groupId>com.sun.jmx</groupId>
			<artifactId>jmxri</artifactId>
		</exclusion>
	</exclusions>
</dependency>