= Evictedに注意 =
※以下は依存定義としてpom.xmlを前提としている。
pom.xmlへの依存として矛盾のある記述をしてしまうとevictedという報告がなされる。
このようなpom.xmlを持つモジュールを他のプロジェクトで使用すると、推移的依存を一切取得してこないので注意。
例えば、pom.xmlを以下のように記述してみる。
{{{
4.0.0
xxx
xxx
0.1.0
ch.qos.logback
logback-classic
0.9.24
ch.qos.logback
logback-core
0.9.24
org.slf4j
slf4j-api
1.6.1
jar
compile
}}}
これには問題がある。
logback-0.9.24は、実際にはslf4j-1.6.0に依存しているのであるが、ここでは1.6.1を取得するように指示している。
このとき、以下のbuild.xmlでresolveを行うと、
{{{
}}}
以下のようなメッセージが表示される。
{{{
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に以下を追加する。
{{{
}}}
このreportターゲットを実行すると、カレントディレクトリに依存関係のレポートを表すhtmlなどが作成される。
このhtmlのサンプルが[[http://ant.apache.org/ivy/history/latest-milestone/samples/apache-hello-ivy-default.html|ここ]]にある。
解決方法としては、正しくslf4j-apiの1.6.0を指定するか、あるいは全く記述しないことである。
== IvyDEですぐにevictedを検出するには ==
上記では、antを起動して初めてevictedを検出することができるのだが、eclipse上でIvyDEを使用している場合には、それ以前に依存関係の解決が行われている。例えば、pom.xmlを変更してセーブした時点である。依存関係の解決が行われないと、プロジェクトのコードもコンパイルできないのであるから当然である。
これを検出するには[[ivy/IvyDE]]のIvy Consoleを参照のこと。