web-dev-qa-db-ja.com

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

私はMavenスナップショットの意味について少し混乱していますが、なぜそれを作成するのですか?

731
meisam

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

アイデアは、before1.0リリース(またはその他のリリース)が行われ、1.0-SNAPSHOTが存在するということです。そのバージョンは、になる可能性のあるものです1.0。基本的には「1.0開発中」です。これは、実際の1.0リリースに近いcloseか、かなり遠い(たとえば、0.9リリースの直後)です。

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

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

903
Joachim Sauer

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

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

たとえば、foo-1.0.jarライブラリはstableバージョンと見なされ、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はnot新しいバージョンのリポジトリをチェックしてください。

Mavenはあなたのリポジトリ定義でこのアップデートポリシーを変更する方法を提供します:

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

XXXは以下のようになります。

  • always:Mavenはビルドごとに新しいバージョンをチェックします。
  • daily、デフォルト値。
  • interval:XXX:分単位の間隔(XXX)
  • never:Mavenは他のバージョンを検索しようとしません。それがローカルに存在しない場合にのみそれが行われます。この設定では、SNAPSHOTバージョンは安定版ライブラリとして扱われます。

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

714
Romain Linsolas

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

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

コードの準備が整い、それをリリースするときが来たら、POMにリストされているバージョンを変更します。それから、「スナップショット」を持つ代わりに、「1.0」のようなラベルを使うでしょう。

バージョニングの手助けについては、 Semantic Versioning specification を調べてください。

60
jjnguy

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

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

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

23
Peter Lawrey

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

たとえば、プロジェクトのバージョンが「1.0-SNAPSHOT」で、このプロジェクトのアーティファクトをMavenリポジトリにデプロイする場合、11にリリースをデプロイする場合、Mavenはこのバージョンを「1.0-20080207-230803-1」に拡張します。 2008年2月7日UTC:08 PMつまり、スナップショットをデプロイしても、ソフトウェアコンポーネントはリリースされていません。特定の時点でコンポーネントのスナップショットを公開しています。

そのため、主にスナップショットバージョンはアクティブ開発中のプロジェクトに使用されます。開発中のソフトウェアコンポーネントにプロジェクトが依存している場合は、スナップショットリリースに依存している可能性があり、ビルドを実行すると、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リリースプロセスの一例

enter image description here

13

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

<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>

もう1つのケースは、

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

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

4
Kati Holasz

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

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

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

4
Venky Vungarala

用語について説明したいのですが。他の回答では、「スナップショット」バージョンが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:リリース版(明らかに安定したスナップショットではない版です)。
4
Garret Wilson

単にスナップショットとは、安定版ではない版です。

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

0

sDLCのコンテキストを理解することは、スナップショットとリリースの違いを理解するのに役立ちます。開発プロセスの間、開発者全員が彼らの機能をベースラインブランチに提供します。ある時点で、リーダーは十分な機能が蓄積されたと考え、それから彼はベースラインブランチからリリースブランチを切ります。この時点より前のビルドはスナップショットです。ここまでのビルドはリリースです。リリーステスト中に不具合が発見された場合は、リリースビルドが実稼働前に変更される可能性があります。

0
CCNA

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

0
Mahdi Soltani