Evictedに注意
※以下は依存定義としてpom.xmlを前提としている。
pom.xmlへの依存として矛盾のある記述をしてしまうとevictedという報告がなされる。 このようなpom.xmlを持つモジュールを他のプロジェクトで使用すると、推移的依存を一切取得してこないので注意。
例えば、pom.xmlを以下のように記述してみる。
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>xxx</groupId>
<artifactId>xxx</artifactId>
<version>0.1.0</version>
<dependencies>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>0.9.24</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>0.9.24</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.6.1</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
</dependencies>
</project>これには問題がある。 logback-0.9.24は、実際にはslf4j-1.6.0に依存しているのであるが、ここでは1.6.1を取得するように指示している。 このとき、以下のbuild.xmlでresolveを行うと、
<!-- 必要なセットアップはされているものとする -->
<target name="resolve">
<ivy:configure />
<ivy:resolve file="pom.xml" conf="compile" />
<ivy:retrieve/>
</target>以下のようなメッセージが表示される。
resolve:
[ivy:configure] :: Ivy 2.1.0 - 20090925235825 :: http://ant.apache.org/ivy/ ::
[ivy:configure] :: loading settings :: file = ......................
[ivy:resolve] :: resolving dependencies :: xxx#xxx;0.1.0
[ivy:resolve] confs: [compile]
[ivy:resolve] found ch.qos.logback#logback-classic;0.9.24 in ibiblio
[ivy:resolve] found ch.qos.logback#logback-core;0.9.24 in ibiblio
[ivy:resolve] found org.slf4j#slf4j-api;1.6.0 in ibiblio
[ivy:resolve] found org.slf4j#slf4j-api;1.6.1 in ibiblio
[ivy:resolve] :: resolution report :: resolve 965ms :: artifacts dl 5ms
[ivy:resolve] :: evicted modules:
[ivy:resolve] org.slf4j#slf4j-api;1.6.0 by [org.slf4j#slf4j-api;1.6.1] in [compile]
---------------------------------------------------------------------
| | modules || artifacts |
| conf | number| search|dwnlded|evicted|| number|dwnlded|
---------------------------------------------------------------------
| compile | 4 | 0 | 0 | 1 || 3 | 0 |
---------------------------------------------------------------------
[ivy:retrieve] :: retrieving :: clog#clog
[ivy:retrieve] confs: [compile]
[ivy:retrieve] 3 artifacts copied, 0 already retrieved (551kB/90ms)表の中のevictedの数が1と表示されており、その前の「evicted modules」に、slf4j-apiの1.6.0が1.6.1によってevict(立ち退かせる)されたことが示されている。つまり、ivyはlogbak 0.9.24の推移的依存としてslf4j-api 1.6.0を取得しようとしたが、1.6.1が明示されているのでそれを行わなかったのである。
推移的依存関係をレポートにまとめる機能があるので、それを使用して何が起こっているのか調べることができる。 build.xmlに以下を追加する。
<target name="report" depends="resolve"> <ivy:report/> </target>
このreportターゲットを実行すると、カレントディレクトリに依存関係のレポートを表すhtmlなどが作成される。 このhtmlのサンプルがここにある。
解決方法としては、正しくslf4j-apiの1.6.0を指定するか、あるいは全く記述しないことである。
IvyDEですぐにevictedを検出するには
上記では、antを起動して初めてevictedを検出することができるのだが、eclipse上でIvyDEを使用している場合には、それ以前に依存関係の解決が行われている。例えば、pom.xmlを変更してセーブした時点である。依存関係の解決が行われないと、プロジェクトのコードもコンパイルできないのであるから当然である。
これを検出するにはivy/IvyDEのIvy Consoleを参照のこと。
