私は、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 では、最新のファイルを提供する (以前の最新のファイルを上書きする) ことしかできません。
これらの問題に対処するための回避策があります。
- 2 番目のリンクで提案されているように、メタデータを完全に無視し (「useMavenMetadata」属性を false に設定)、デフォルトでファイル名を比較する ivy の古いメカニズムに戻すことができます。これは、ivy クライアントの問題のみを修正します。
- リポジトリ マネージャーは、メタデータ ファイルを再生成できる必要があります (Nexus には、少なくともこれを行うタスクがあります)。
- Maven ANT タスクを使用します。
最後の提案は、見た目ほどクレイジーではありません。第一に、タイムスタンプ付きのスナップショットをサポートするために私が知っている唯一の方法であり、第二に、Maven クライアントは、ほとんど文書化されていない多くの余分な処理 (モジュール メタデータの更新) を行うようです。