= 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を参照のこと。