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