4

私は Ivy を少し使っていますが、まだ学ぶべきことがたくさんあるようです。

私は2つのプロジェクトを持っています。1 つは Web アプリで、もう 1 つは Web アプリが依存するライブラリです。セットアップは、ライブラリ プロジェクトが jar ファイルにコンパイルされ、Ivy を使用してプロジェクト内のディレクトリに発行されることです。Web アプリのビルド ファイルには、Ivy resolve ant タスクを呼び出す ant ターゲットがあります。

私がやりたいことは、開発中 (開発者のローカル マシン上) に動的解決モードを使用する Web アプリと、テストおよび運用ビルド用の既定の解決モードを使用することです。以前は、ライブラリ アーカイブ ファイルにタイム スタンプを追加して、Web アプリがファイルへの依存関係を解決しようとしたときに、Ivy がファイルの変更を認識できるようにしていました。Eclipse 内では、Web アプリでは新しいライブラリ jar が公開されるたびにプロジェクトを更新し、ビルド パスを微調整する必要があったため、これは面倒です。似たような名前の jar ファイルを毎回発行すると、開発者はプロジェクトを更新するだけで済みます。

問題は、Web アプリが動的 jar ファイルを取得できないことです。

私が得る出力は次のようになります。

resolve:
[ivy:configure] :: Ivy 2.1.0 - 20090925235825 :: http://ant.apache.org/ivy/ ::
[ivy:configure] :: loading settings :: file = /Users/richard/workspace/webapp/web/WEB-INF/config/ivy/ivysettings.xml
[ivy:resolve] :: resolving dependencies :: com.webapp#webapp;working@hoth-3.local
[ivy:resolve]   confs: [default]
[ivy:resolve]   found com.webapp#library;latest.integration in local
[ivy:resolve] :: resolution report :: resolve 142ms :: artifacts dl 0ms
---------------------------------------------------------------------
|                  |            modules            ||   artifacts   |
|       conf       | number| search|dwnlded|evicted|| number|dwnlded|
---------------------------------------------------------------------
|      default     |   1   |   0   |   0   |   0   ||   0   |   0   |
---------------------------------------------------------------------
[ivy:resolve] 
[ivy:resolve] :: problems summary ::
[ivy:resolve] :::: WARNINGS
[ivy:resolve]       ::::::::::::::::::::::::::::::::::::::::::::::
[ivy:resolve]       ::          UNRESOLVED DEPENDENCIES         ::
[ivy:resolve]       ::::::::::::::::::::::::::::::::::::::::::::::
[ivy:resolve]       :: com.webapp#library;latest.integration: impossible to resolve dynamic revision
[ivy:resolve]       ::::::::::::::::::::::::::::::::::::::::::::::
[ivy:resolve] :::: ERRORS
[ivy:resolve]   impossible to resolve dynamic revision for com.webapp#library;latest.integration: check your configuration and make sure revision is part of your pattern
[ivy:resolve] 
[ivy:resolve] :: USE VERBOSE OR DEBUG MESSAGE LEVEL FOR MORE DETAILS

BUILD FAILED 
/Users/richard/workspace/webapp/build.xml:71: impossible to resolve dependencies:
resolve failed - see output for details

Web アプリの解決ターゲットは次のようになります。

<target name="resolve" depends="load-ivy">
    <ivy:configure file="${ivy.dir}/ivysettings.xml" />

    <ivy:resolve 
        file="${ivy.dir}/ivy.xml" 
        resolveMode="${ivy.resolve.mode}"/>

    <ivy:retrieve pattern="${lib.dir}/[artifact]-[revision].[ext]" type="jar" sync="true" />
</target> 

この場合、ivy.resolve.mode の値は「dynamic」です (引用符なし)。

Web アプリの Ivy ファイルは単純です。次のようになります。

<ivy-module version="2.0" 
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:noNamespaceSchemaLocation="http://ant.apache.org/ivy/schemas/ivy.xsd">

    <info organisation="com.webapp" module="webapp"/>

    <dependencies>
        <dependency name="library" rev="${ivy.revision.default}" revConstraint="${ivy.revision.dynamic}" />
    </dependencies>

</ivy-module>

開発中、ivy.revision.dynamic の値は「latest.integration」です。一方、本番またはテスト中、「ivy.revision.default」の値は「1.0」です。

何か案は?他に提供する必要がある情報がある場合はお知らせください。

ありがとう!

4

2 に答える 2

4

以下を追加しましたが、うまくいくようです。私はツタにも苦労しており、私が取り組んでいる多くのものはほとんどブラックボックスで動作していることを認めてこれを警告します...つまり、それは仕事をするので、いじるのをやめます! 私の理解はやや進んでいません。

Anwyay、settings.xml に追加しました:

 <modules>
     <module organisation="my.organisation" name="*" resolveMode="dynamic"/>
 </modules>

これは、アイビーにその知性を使用してこれらのモジュールを操作するように指示していると思います。そのインテリジェンスには、解決時のモジュールの更新バージョンのチェックが含まれている可能性があります。

また、私が追加したリゾルバーではcheckModifiedchangingPattern. 実際のリゾルバーとラッピング チェーン (ある場合) の両方でこれを行うことが明らかに重要です。

<chain name="foo" checkmodified="true"  changingPattern=".*-SNAPSHOT">
    <url name="bar" checkmodified="true" changingPattern=".*-SNAPSHOT">  
       <ivy pattern=... />  
       <artifact pattern=... /> 
    </url>  
    ...
</chain>

checkModifiedうまくいけば、缶に書かれていることを実行します。changingPatternそして、このパターンを含むアーティファクトがリポジトリに新しい更新があるかどうかを確認するよう ivy に指示していることを収集します。私は個人的に、変更可能なものには常に -SNAPSHOT が追加されている Maven リポジトリを使用しているため、それを使用しています (かなり一般的だと思います)。changingPatternこれを「.*」またはより適切なものに置き換えることができると思います。

于 2010-06-10T14:08:20.243 に答える
3

webapp の ivy ファイルでrevConstraint属性の使用をやめる必要があると思います。

アイビーは、実際に最新のリビジョンを探すのではなく、「latest.revision」が取得したいリビジョンであると考えています:-)

次のように依存関係を設定することをお勧めします。

<dependency name="library" rev="latest.integration"/>

説明:

revConstraintは、モジュールを公開するときに設定されます。発行時の最新のリビジョンを記録します。したがって、開発中には必要ありません。リビジョン変数を使用する必要もありません。「latest.revision」または「latest.release」リビジョン参照を使用して ivy モジュールを公開すると、解決されてrevConstraint属性に記録されます。

詳細については、次のリンクを参照してください。

http://ant.apache.org/ivy/history/latest-milestone/ivyfile/dependency.html#revision-constraint

于 2010-05-02T22:33:01.363 に答える