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>