Locked History Actions

ivy/Evicted

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