4

スナップショットの依存関係が更新されたときに Ivy にキャッシュを更新させることができません。リゾルバー (to には次の設定があります。

<url name="xxx" m2compatible="false" 
     checkmodified="true" changingMatcher="regexp" 
     changingPattern=".*-SNAPSHOT.*">

アーティファクト ファイル名の例 (Artifactory 内) は次のとおりです。

my-jar-1.999-SNAPSHOT.jar

解決の詳細な Ant ログには、次のものが含まれます。

[NOT REQUIRED] com.myorg#my-module;1.999-SNAPSHOT!my-jar.jar

アーティファクトに POM はありません。

リゾルバーはチェーン リゾルバーの下にあります。両方とも、関連するすべての属性セットを持っています。https://issues.apache.org/jira/browse/IVY-938https://issues.apache.org/jira/browse/IVY-1221をすべてのコメントとAFAICT (おそらく間違っている! ) 対応する回避策はありません。

スナップショットをあきらめて、「integration.latest」動的にバージョン管理された依存関係を持つ明示的なバージョンを使用する必要がありますか? 複数のメジャー バージョンに対して統合ビルドが行われている場合、これが失敗する可能性があるのではないかと心配しています。その時点で、「integration.latest」を機能させるために、メジャー バージョンを個別のリポジトリに分割するか、アーティファクト名にメジャー ビルド番号を含めるか、同様に不格好なものにする必要があります。

4

2 に答える 2

5

私は、Maven リポジトリ マネージャーと話すときに URL リゾルバーを使用するのが好きではありません。問題は、Maven がスナップショット リビジョンに対して特別でかなり独自の処理を行うことです..... URL リゾルバーは、アイビー リポジトリに対して使用するのにより適しています。

私は Nexus を使用していますが、以下は Artifactory にも当てはまるはずです。次の設定ファイルは、Maven Central と私の 2 つのホストされたリポジトリを設定します (Maven リポジトリには、リリースとスナップショットの 2 つのフレーバーがあります)。

<ivysettings>
    <settings defaultResolver="repos" />
    <resolvers>
        <chain name="repos">
            <ibiblio name="central" m2compatible="true"/>   
            <ibiblio name="my-releases" m2compatible="true" root="https://myhost/releases"/>   
            <ibiblio name="my-snapshots" m2compatible="true" root="https://myhost/snapshots"/>   
        </chain>
    </resolvers>
</ivysettings>

Maven の特別なスナップショット処理を解読するための内部ロジックを持つibilioリゾルバーを使用していることに気付くでしょう。

スナップショットのリビジョンが必要な場合は、次のように明示的に宣言すると思います。

<ivy-module version="2.0">
    <info organisation="myOrg" module="Demo"/>
    <dependencies>
        <dependency org="myOrg" name="myModule" rev="2.7-SNAPSHOT"/>
        ..
    </dependencies>
</ivy-module>

内部では、ibilioリゾルバーが Maven リポジトリのメタデータ ファイルを読み取って、スナップショット リポジトリから取得する必要があるタイムスタンプ付きのアーティファクトを決定します。

アップデート

次のプレゼンテーションを読むことをお勧めします。

開発ビルド (またはスナップショット) からリリースを分離する Maven の哲学の概要を説明しています。また、Maven の非常に厄介な側面の 1 つについても説明しています...アーティファクトを公開する 2 つの異なる方法...

あなたがやろうとしていることは、CDパイプラインをセットアップしている著者の方針に沿っていると思います. その場合、すべてのビルドは潜在的なリリースであり、そのように扱う必要があります (スナップショットによって許可される動的な依存関係はありません)。

スナップショットを開発者のみのビルドに制限することをお勧めします。リリース候補のみを展開します。このアプローチの問題点は、大量のリリースを管理することです。一部のリポジトリ マネージャー (Nexus、Artifactory、Archiva) は、品質の料金所を通過しないリリースを認定または破棄できるようにする「ステージング」機能を提供します。

更新 2

ivy を使用してスナップショットを Maven リポジトリに公開している場合、いくつかの問題があります。

私の意見では、タイムスタンプ付きのファイルは、そもそもスナップショットを使用する際のキラー機能の 1 つです。ivy では、最新のファイルを提供する (以前の最新のファイルを上書きする) ことしかできません。

これらの問題に対処するための回避策があります。

  1. 2 番目のリンクで提案されているように、メタデータを完全に無視し (「useMavenMetadata」属性を false に設定)、デフォルトでファイル名を比較する ivy の古いメカニズムに戻すことができます。これは、ivy クライアントの問題のみを修正します。
  2. リポジトリ マネージャーは、メタデータ ファイルを再生成できる必要があります (Nexus には、少なくともこれを行うタスクがあります)。
  3. Maven ANT タスクを使用します。

最後の提案は、見た目ほどクレイジーではありません。第一に、タイムスタンプ付きのスナップショットをサポートするために私が知っている唯一の方法であり、第二に、Maven クライアントは、ほとんど文書化されていない多くの余分な処理 (モジュール メタデータの更新) を行うようです。

于 2013-01-21T19:20:59.870 に答える
3

苦労の日々の後...

問題は

checkmodified="true" changingMatcher="regexp"

<resolver>で機能するには、階層行のすべてのリゾルバー(すべての親<chain>リゾルバーと下部の<url>、<local>、または<ibiblio>リゾルバー)に存在する必要があります。

于 2013-01-25T15:32:49.657 に答える