Mavenスナップショットとは正確には何ですか?なぜそれが必要なのですか?


回答:


1013

Mavenのスナップショットバージョンは、リリースされていないバージョンです。

アイデアは、ということである前に1.0リリース(または任意の他のリリース)が存在し、実行されます1.0-SNAPSHOT。そのバージョンが何になる1.0です。基本的には「1.0開発中」です。これは実際のリリースに近い場合もあれば1.0、かなり離れている場合もあります(0.9たとえば、リリース直後)。

「実際の」バージョンとスナップショットバージョンの違いは、スナップショットが更新を取得する可能性があることです。つまり、1.0-SNAPSHOT今日のダウンロードでは、昨日または明日のダウンロードとは異なるファイルが提供される可能性があります。

通常、スナップショットの依存関係は開発中にのみ存在する必要があり、リリースされたバージョン(つまり、非スナップショット)はスナップショットバージョンへの依存関係を持ちません。


67
@amphibient:いいえ、スナップショットは必ずしも安定しているとは限りません。最新のビルドにすぎません。スナップショットは実際のリリースの前にあり、その後にはありません。実際、バージョン番号は通常ブランチを参照していません。
avandeursen 14年

9
@avandeursenスナップショットは、必ずしもあなたが主張するセマンティクスを持っているわけではありません。「master-SNAPSHOT」を使用して、後で1.0リリースを作成できます。「FutureVersion-SNAPSHOT」である必要はなく、リリースの前にある必要もありません。それ以外はすべて正しいです-これは動くターゲットへの不安定な参照であり、繰り返し可能なビルドを生成するために信頼することはできません。
スコットキャリー

3
@ScottCareyに感謝します。「一般的に先行する」は、「移動するターゲット」が最終的に存在するという保証すらないので、おそらくもっと正確でしょう。
avandeursen

1
@ジェイ:いいえ、私が特定のスナップショットを明示的に参照する方法がないことを知っている限り、それらは設計上、アドレス指定不可/交換可能です。きめ細かいバージョン管理が必要な場合は、特定のバージョン文字列(-RC1、-RC2など)でリリース候補をリリースするだけです。
Joachim Sauer

14
なぜそれを " 1.0-DEVELOPMENT"または " 1.0-INPROGRESS"のように呼ぶことができないのですか、なぜ人々は自明ではない用語を使用しなければならないのですか
uh_big_mike_boi

792

他の3つの答え-SNAPSHOTは、バージョンとは何かについての良いビジョンを提供します。MavenがSNAPSHOT依存関係を見つけたときの動作に関する情報を追加したかっただけです。

アプリケーションをビルドすると、Mavenはローカルリポジトリで依存関係を検索します。そこで安定版が見つからない場合は、リモートリポジトリ(settings.xmlまたはで定義pom.xml)を検索して、この依存関係を取得します。次に、それをローカルリポジトリにコピーして、次のビルドで使用できるようにします。

たとえば、foo-1.0.jarライブラリは安定版と見なされ、Mavenがローカルリポジトリでライブラリを見つけた場合、現在のビルドにこのライブラリを使用します。

foo-1.0-SNAPSHOT.jarライブラリが必要な場合、Mavenはこのバージョンが安定しておらず、変更される可能性があることを認識します。このため、このライブラリのバージョンがローカルリポジトリで見つかった場合でも、Mavenはリモートリポジトリで新しいバージョンを見つけようとします。ただし、このチェックは1日に1回だけ行われます。つまりfoo-1.0-20110506.110000-1.jar、ローカルリポジトリに(つまり、このライブラリが2011/05/06の11:00:00に生成されている)場合、同じ日に再度Mavenビルドを実行すると、Maven はリポジトリをチェックしません。新しいバージョン。

Mavenは、リポジトリー定義でこの更新ポリシーを変更する方法を提供します。

<repository>
    <id>foo-repository</id>
    <url>...</url>
    <snapshots>
        <enabled>true</enabled>
        <updatePolicy>XXX</updatePolicy>
    </snapshots>
</repository>

どこにありXXXますか:

  • 常に:Mavenはすべてのビルドで新しいバージョンをチェックします。
  • 毎日、デフォルト値。
  • interval:XXX:分単位の間隔(XXX)
  • never:Mavenが別のバージョンを取得しようとすることはありません。それがローカルに存在しない場合にのみそれを行います。設定により、SNAPSHOTバージョンは安定したライブラリとして扱われます。

(settings.xmlのモデルはここにあります)


2
すべての再ダウンロードのMaven力にコマンドラインスイッチを使用することが可能であると思われるSNAPSHOT:バージョンmvn clean package -UごとのようにMavenのチュートリアル
のDimitry K

3
-Uフラグに注意してください。MNG-4142が原因で、期待どおりに動作しない可能性があります。
Kevin Cross、

3
また、リリースバージョンを作成する際には、スナップショットの依存関係を使用しないことをお勧めします。スナップショットの依存関係が存在すると、Mavenリリースプラグインは失敗します。
RCross

2
私は実行mvn installして、バージョン1.0-SNAPSHOTのjarファイルをローカルリポジトリにインストールしました。翌日、プロジェクトに変更を加えましたが、バージョンは変更しませんでした。実行mvn installすると、ローカルリポジトリで変更されなかったようです。それは予想される動作ですか?バージョンを再利用して、mvn install変更後に上書きすることはできますか?
Don Cheadle 2014年

1
@mmcrae AFAIK更新する必要があります。これが、インストールの目的であるローカルのSNAPSHOT jarの更新です。他に何か発見しましたか?
ジョニー

73

「スナップショット」という用語は、ビルドが特定の時点でのコードのスナップショットであることを意味します。

通常、このバージョンはまだ開発中です。

コードの準備ができてリリースするときは、POMにリストされているバージョンを変更する必要があります。次に、「SNAPSHOT」の代わりに、「1.0」のようなラベルを使用します。

バージョニングのヘルプについては、セマンティックバージョニング仕様を確認してください。


セマンティックバージョニングの観点から、-SNAPSHOTリリースはプレリリースになります: " プレリリースバージョンは、バージョンが不安定であり、関連する通常のバージョンで示されているように、意図した互換性要件を満たさない可能性があることを示します。例:1.0.0 -alpha、1.0.0-alpha.1、1.0.0-0.3.7、1.0.0-x.7.z.92。 "
avandeursen

3
「SNAPSHOT」は「特定の時点でのコードのスナップショット」ではなく、「利用可能なコードの最新ビルド」のように思えます。これがHTTPの場合は、「HEADを実行しないで、とにかくサーバー上にあるものを何でも入手してください」というフラグになります。実際、それは「ある時点でのコード」とはほぼ反対です。
lilbyrdie、2015年

「重い」開発とは何ですか?
ジョーカー

1
@Jokerの「重い」とは、多くのことが変更されるとき(新機能、リファクタリングなど)
ロバート

28

「リリース」は、変更されないバージョンの最終ビルドです。

「スナップショット」は、同じ名前を持つ別のビルドに置き換えることができるビルドです。これは、ビルドがいつでも変更される可能性があり、まだ活発に開発中であることを意味します。

同じコードに基づいて、ビルドごとに異なるアーティファクトがあります。たとえば、デバッグがあるものとないものがあります。1つはJava 5.0用で、もう1つはJava 6用です。一般的に、必要なすべてを実行する1つのビルドを作成する方が簡単です。;)


21

Mavenバージョンには、プロジェクトが現在開発中であることを示す文字列リテラル「SNAPSHOT」を含めることができます。

たとえば、プロジェクトに「1.0-SNAPSHOT」のバージョンがあり、このプロジェクトのアーティファクトをMavenリポジトリにデプロイする場合、11でリリースをデプロイすると、Mavenはこのバージョンを「1.0-20080207-230803-1」に拡張します。 :2008年2月7日UTCの午後8時。つまり、スナップショットを展開するときは、ソフトウェアコンポーネントのリリースを作成するわけではありません。特定の時間にコンポーネントのスナップショットを解放しています。

そのため、主にスナップショットバージョンは、開発中のプロジェクトに使用されます。プロジェクトが開発中のソフトウェアコンポーネントに依存している場合は、スナップショットリリースに依存できます。ビルドを実行すると、Mavenはリポジトリから最新のスナップショットを定期的にダウンロードしようとします。同様に、システムの次のリリースのバージョンが「1.8」になる場合、正式にリリースされるまで、プロジェクトのバージョンは「1.8-SNAPSHOT」になります。

たとえば、次の依存関係では、常にSpringの最新の1.8開発JARがダウンロードされます。

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring</artifactId>
        <version>1.8-SNAPSHOT”</version>
    </dependency>

メイベン

Mavenリリースプロセスの例

ここに画像の説明を入力してください


6

用語について指摘したいのですが。他の回答は、「スナップショット」バージョンがMavenのコンテキストで何であるかについての適切な説明を与えました。しかし、スナップショット以外のバージョンは「リリース」バージョンと呼ばれるべきですか?

「リリース」バージョンのセマンティックバージョニングのアイデアの間には多少の緊張があります。これは、などの修飾子を持たないが、などの修飾子-SNAPSHOTも持たないバージョンのように思われ-beta.4ます。Mavenの「リリース」バージョンのアイデア。これにはの欠如のみが含まれているようです-SNAPSHOT

言い換えると、「リリース」が「Maven Centralにリリースできる」を意味するのか、「ソフトウェアが最終的にリリースされる」のかという意味のあいまいさがあります。-beta.4一般にリリースした場合は「リリース」バージョンと見なすことができますが、「最終リリース」ではありません。セマンティックバージョニングでは、のようなもの-beta.4が「プレリリース」バージョンであることが明確に示されているため、がなくても「リリース」バージョンと呼ばれるのは意味がありません-SNAPSHOT。実際に-rc.5は、テストのためにパブリックアクセスを許可している場合でも、実際にはリリース候補であり、実際のリリースではありません。

したがって、Mavenにも関わらず、私の意見では、修飾子がまったくない「リリース」バージョンのみを呼び出す方が適切と思われます-beta.4。おそらく、Mavenの非スナップショットバージョンのより適切な名前は、「別の回答に触発された」「安定した」バージョンでしょう。したがって、次のようになります。

  • 1.2.3-beta.4-SNAPSHOT:プレリリースバージョンのスナップショットバージョン。
  • 1.2.3-SNAPSHOT:リリースバージョンのスナップショットバージョン。
  • 1.2.3-beta.4:プレリリース版の安定版。
  • 1.2.3:リリースバージョン(明らかに、安定した非スナップショットバージョンです)。

Mavenがビルドメタデータまたはプレリリースの命名規則をどのように処理するかについて何か情報はありますか?つまり、アルファはベータに先行することは誰もが知っていますが、mavenは知っていますか?1.2.3-beta.4が安定版リリースであるとしても、少なくとも1.2.3がそれ以降であることを知っていますか?
DGoiko

5

これは、リポジトリのスナップショットのようであり、この場合は有効になっていません。つまり、ここで参照されているリポジトリは安定しており、更新の必要はありません。

<project>
    ...
    <repositories>
        <repository>
            <id>lds-main</id>
            <name>LDS Main Repo</name>
            <url>http://code.lds.org/nexus/content/groups/main-repo</url>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </repository>
    </repositories>
</project>

別のケースは次のようなものです:

<snapshots>
        <enabled>true</enabled>
</snapshots>

つまり、Mavenはこのリポジトリーの更新を探します。タグで更新の間隔を指定することもできます。


5

通常、Mavenには2種類のビルドがあります1)スナップショットビルド2)リリースビルド

  1. スナップショットビルド:SNAPSHOTは、通常のバージョンとは異なり、現在のデプロイメントコピーを示す特別なバージョンです。mavenはリモートリポジトリ内のすべてのビルドのバージョンをチェックするため、スナップショットビルドは開発ビルドにすぎません。

  2. ビルドのリリース:リリースとは、ビルドのバージョンでSNAPSHOTを削除することを意味します。これらは通常のビルドバージョンです。


3

単にスナップショットとは、安定していないバージョンであることを意味します。

バージョンに1.0.0のようなスナップショットが含まれている場合-SNAPSHOTは安定したバージョンではなく、依存関係を解決するためにリモートリポジトリを探すことを意味します


1

SDLCのコンテキストを理解すると、スナップショットとリリースの違いを理解するのに役立ちます。開発プロセス中、開発者全員がベースラインブランチに機能を提供します。ある時点で、リードは十分な機能が蓄積されたと判断し、ベースラインブランチからリリースブランチをカットします。この時点より前のビルドはスナップショットです。この時点までのビルドはリリースです。リリーステスト中に欠陥箇所があった場合、本番環境に移行する前にリリースビルドも変更される可能性があることに注意してください。


1

スナップショットとは単に、設定に応じてMavenが特別な依存関係の最新の変更をチェックすることを意味します。スナップショットは開発中のため不安定ですが、特別なプロジェクトで最新の変更が必要な場合は、依存関係バージョンをスナップショットバージョンに設定する必要があります。このシナリオは、これらの製品が互いに非常に密接に関連している複数の製品を持つ大規模組織で発生します。


0

名前が示すように、スナップショットはプロジェクトの状態とその瞬間の依存関係を指します。mavenがプロジェクトの新しいスナップショットを見つけると、ローカルリポジトリにあるプロジェクトの古い.jarファイルをダウンロードして置き換えます。

スナップショットバージョンは、開発中のプロジェクトに使用されます。プロジェクトが開発中のソフトウェアコンポーネントに依存している場合は、スナップショットリリースに依存できます。ビルドを実行すると、Mavenはリポジトリから最新のスナップショットを定期的にダウンロードしようとします。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.