6

次のアイビーファイルがあります。

<configurations defaultconfmapping="buildtime">
    <conf name="buildtime" visibility="private" description="Libraries needed only for compilation" />
    <conf name="runtime" description="Libraries only needed at runtime" />
    <conf name="test" description="Libraries only needed for testing" />
</configurations>

<dependencies>
  <dependency org="net.java.dev" name="jvyaml" rev="0.2.1" conf="runtime" />
  <dependency org="org.apache.solr" name="solr-core" rev="3.6.0" conf="runtime" />

</dependencies>

そして、次のようなアリの取得タスクがあります。

<target name="retrieve-all" depends="resolve">
    <ivy:retrieve pattern="lib/[conf]/[artifact]-[revision].[ext]" conf="*" />
</target>

奇妙なことに、すべての solr 依存関係が期待どおりに lib/runtime にダウンロードされますが、jvyaml モジュールはそうではありません! 「解決」しますが、依存関係の宣言を次のように変更しない限り、lib/runtime ディレクトリにダウンロードされません。

<dependency org="net.java.dev" name="jvyaml" rev="0.2.1" conf="runtime->master" />

このマスター構成とは何ですか? また、solr ではなく jvyaml jar をプルする必要があるのはなぜですか?

ありがとう

4

2 に答える 2

20

次のように構成を再構築することをお勧めします。

<ivy-module version="2.0">
    <info organisation="com.myspotontheweb" module="demo"/>

    <configurations>
        <conf name="compile" description="Libraries needed only for compilation" />
        <conf name="runtime" description="Libraries only needed at runtime" extends="compile" />
        <conf name="test" description="Libraries only needed for testing" extends="runtime" />
    </configurations>

    <dependencies>
        <dependency org="net.java.dev" name="jvyaml" rev="0.2.1" conf="runtime->default" />
        <dependency org="org.apache.solr" name="solr-core" rev="3.6.0" conf="runtime->default" />
    </dependencies>

</ivy-module>

導入された重要な変更:

  1. より標準的な「コンパイル」構成を使用する
  2. 「extends」属性を使用した構成の継承。コンパイルの依存関係は、ランタイム構成とテスト構成の両方に自動的に含めることができます。
  3. 構成マッピングを使用します。たとえば、conf="runtime->default" です。これにより、どのローカル構成がどのリモート構成に関連付けられているかが明確になります。

構成マッピングの説明

構成は、強力な Ivy 機能です。ivy が Maven モジュールをダウンロードすると、内部変換が実行され、この回答にリストされている標準の構成セットが割り当てられます。

依存関係を宣言するときは、常に構成マッピングを使用することをお勧めします。これにより、依存関係のアーティファクトがどこに割り当てられているかが明確になります。

例えば:

<dependency org="??" name="??" rev="??" conf="runtime->default" />

ここでは、リモート モジュールのデフォルトの依存関係をローカル ランタイム構成に関連付けたいと言っています。

実際には、実際に必要なリモート構成マッピングは 2 つだけです。

  • default : リモート モジュールのアーティファクトとその実行時の推移的な依存関係すべて
  • master : リモート モジュールのアーティファクトのみ (推移的な依存関係なし)

結論として、あなたの問題は、リモートMavenモジュールの「ランタイム」スコープにMavenモジュールのアーティファクトが含まれていないという事実によって引き起こされたと思います。代わりに、モジュールjvyamlの存在しない推移的な依存関係を取得していました:-(

追加のアドバイス

次のように、アイビーの依存関係管理レポートを生成することもお勧めします。

<target name="init" description="Resolve dependencies and populate lib dir">
    <ivy:resolve/>
    <ivy:report todir="${build.dir}/ivy-report" graph="false"/>
    <ivy:retrieve pattern="lib/[conf]/[artifact]-[revision].[ext]"/>
</target>

レポートは、各依存関係が異なる構成でどのようになるかを説明するのに役立ちます。また、推移的な依存関係がどのように管理されているかを判断するのにも非常に役立ちます。

そして最後に、構成の継承が功を奏し、ivy 管理の ANT クラスパスを作成するのは次のとおりです。

<target name="init" description="Resolve dependencies and set classpaths">
    <ivy:resolve/>
    <ivy:report todir="${build.dir}/ivy-report" graph="false"/>

    <ivy:cachepath pathid="compile.path" conf="compile"/>
    <ivy:cachepath pathid="runtime.path" conf="runtime"/>
    <ivy:cachepath pathid="test.path"    conf="test"/>
</target>
于 2012-07-10T19:13:55.183 に答える
2

元の solr-core も取得されないことに注意してください。解決したら、キャッシュに移動し、両方のモジュールの ivy.xml ファイルを確認します。

conf=master のみでアーティファクトを公開していることがわかります。

<artifact name="jvyaml" type="jar" ext="jar" conf="master"/>

<artifact name="solr-core" type="jar" ext="jar" conf="master"/>

つまり、buildime 構成が依存関係の「マスター」構成を呼び出す必要があることを示すために、明示的な構成マッピングを行う必要があります。(構成マッピングを確認してください)。

ただし、solr-core の依存関係には、ivy.xml ファイルで確認できる構成マッピングがあります。

<dependency org="org.apache.solr" name="solr-solrj" rev="3.6.0" force="true" conf="compile->compile(*),master(*);runtime->runtime(*)"/>

マスター(*)のやつだと思います。

私が通常行うことは、依存関係を宣言するときに自分のivy.xmlファイルで行います。マッピングを行います。

  <dependency org="net.java.dev" name="jvyaml" rev="0.2.1" conf="runtime->master" />

これは、ランタイムが指定された依存関係でマスター構成を呼び出していることを示しています。

あなたができる

conf="runtime,test->master"

同じように

于 2012-07-10T18:14:19.853 に答える