Upload page content

You can upload content for the page named below. If you change the page name, you can also upload content for another page. If the page name is empty, we derive the page name from the file name.

File to load page content from
Page name
Comment

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