2016-10-03 4 views
3

申し訳異なるリポジトリからの2つの同一のjarファイルをダウンロードするときに使用する.jarファイルかを選択どのよう:Mavenのは、それは長い説明のため

背景:私は2つのプロジェクトを持っている、のは、AとBがプロジェクトAにビルドしましょうNexus Repository Manager OSS 2.12.0 repo Aにデプロイし、Project BのビルドをNexusレポBにデプロイします。私のmavenプロジェクトは、repo Aとrepo Bの両方から.jarsを使用する必要があります。

したがって、私はmavenを設定しました。 2つの異なるNexusリポジトリ(2つのミラーを持つ)を使用するための設定ファイル。

私は、私がMavenプロジェクトをコンパイルすると、repo Aを経由してjarを検索し、repo Bを検索してjarを探します。それが瓶を見つけると、それがダウンロードされます。

問題:私はRepo BをプロジェクトAとプロジェクトBの両方のジャーに使用していました(レポのオーナーが私を蹴飛ばした)。したがって、私は今、リポジトリAとリポジトリBの両方で同じ0.0.1-SNAPSHOTを持っています。

Mavenはコンパイル時にこれらの両方のスナップショットをダウンロードします。

質問:両方とも同じ名前(例:componentName-0.0.1-SNAPSHOT)の場合、どの.jarを使用するかをmavenはどのように解決しますか?ローカルの./m2リポジトリにリゾルバステータスファイルがありますが、両方のjarファイルの間でどのように解決されるかはわかりません。理想的には、mavenに最新の(タイムスタンプに基づいて)更新されたjarファイルを使用したいと考えています。

+0

あなたはjarファイルを選択するあなたの主な手段として、改訂タイムスタンプを使用しないでください。代わりにバージョン番号を使用してください。 – hexafraction

+0

バージョンを増やしてください。 'componentName-0.0.2-SNAPSHOT' – Taylor

+0

複数の[コンフィグレーションをどのように扱うのか?](http://stackoverflow.com/questions/34238196/how-maven-handle-multiple-repository-configurations) –

答えて

3

短い回答:いずれかのリポジトリは、有効なPOMが最初にmavenによって計算されます。 (あなたがmvn help:effective-pomを実行して、効果的なポンポンを表示することができます。)

を長い答え:

次のようにMavenがSNAPSHOTアーティファクトを解決する方法は、(およそ)である:

1)があり、それぞれの依存関係を通過します<dependencies>

2におけるスナップショット・バージョン)各Sについて<snapshotRepositories>

3に記載されているすべてのリポジトリ)を歩きますNAPSHOTリポジトリで、その依存関係のグループ、パッケージ名、およびバージョンのファイルがmaven-metadata.xmlであるかどうかを確認します。

たとえば、パッケージの座標がio.packagecloud:jake:4.0-SNAPSHOTの場合、構成済みの各リポジトリでは/io/packagecloud/jake/4.0-SNAPSHOT/maven-metadata.xmlが検索されます。

4)このファイルが見つかった場合は、このファイルを使用して、dwonloadの最新の案件を探します。例maven-metadata.xmlを見てみると:

$ curl -L https://packagecloud.io/capotej/snapshot_example/maven2/io/packagecloud/jake/4.0-SNAPSHOT/maven-metadata.xml 

<?xml version="1.0" encoding="UTF-8"?> 
<metadata modelVersion="1.1.0"> 
    <groupId>io.packagecloud</groupId> 
    <artifactId>jake</artifactId> 
    <version>4.0-SNAPSHOT</version> 
    <versioning> 
    <snapshot> 
     <timestamp>20161003.234325</timestamp> 
     <buildNumber>2</buildNumber> 
    </snapshot> 
    <lastUpdated>20161003234325</lastUpdated> 
    <snapshotVersions> 
     <snapshotVersion> 
     <extension>jar</extension> 
     <value>4.0-20161003.234325-2</value> 
     <updated>20161003234325</updated> 
     </snapshotVersion> 
     <snapshotVersion> 
     <extension>pom</extension> 
     <value>4.0-20161003.234325-2</value> 
     <updated>20161003234325</updated> 
     </snapshotVersion> 
    </snapshotVersions> 
    </versioning> 
</metadata> 

我々は<lastUpdated>タイムスタンプが20161003234325であることがわかります。このタイムスタンプを使用して、<snapshotVersions>を検索して完全な値を取得します。この場合は、4.0-20161003.234325-2です。

5)今、Mavenはこのスナップショットの完全な、ユニークなバージョンを知って、それがリポジトリからダウンロードすることができます:

curl -I https://packagecloud.io/capotej/snapshot_example/maven2/io/packagecloud/jake/4.0-SNAPSHOT/jake-4.0-20161003.234325-2.jar 

希望これは、あなたの質問に答えます!

関連:

Maven repository support

SBT SNAPSHOT Deploys and fatjar Support

+0

Nexusが同じホストを含​​む1つのホストされたプロキシリポジトリと2つのプロキシリポジトリを持っていれば同じことが適用されますか?プロキシAに、プロキシBおよびホストされたreposよりも新しいライブラリXのlastUpdatedスタンプがあると、それが選択されますか? – f1dave

関連する問題