What exactly is a Maven Snapshot and why do we need it?

我对Maven快照的含义以及为什么我们要构建一个有点困惑?


A snapshot version in Maven is one that has not been released.

The idea is that before a 1.0 release (or any other release) is done, there exists a 1.0-SNAPSHOT . That version is what might become 1.0 . It's basically " 1.0 under development". This might be close to a real 1.0 release, or pretty far (right after the 0.9 release, for example).

The difference between a "real" version and a snapshot version is that snapshots might get updates. That means that downloading 1.0-SNAPSHOT today might give a different file than downloading it yesterday or tomorrow.

Usually, snapshot dependencies should only exist during development and no released version (ie no non-snapshot) should have a dependency on a snapshot version.


The three others answers provide you a good vision of what a -SNAPSHOT version is. I just wanted to add some information regarding the behavior of Maven when it finds a SNAPSHOT dependency.

When you build an application, Maven will search for dependencies in the local repository. If a stable version is not found there, it will search the remote repositories (defined in settings.xml or pom.xml ) to retrieve this dependency. Then, it will copy it into the local repository, to make it available for the next builds.

For example, a foo-1.0.jar library is considered as a stable version, and if Maven finds it in the local repository, it will use this one for the current build.

Now, if you need a foo-1.0-SNAPSHOT.jar library, Maven will know that this version is not stable and is subject to changes. That's why Maven will try to find a newer version in the remote repositories, even if a version of this library is found on the local repository. However, this check is made only once per day. That means that if you have a foo-1.0-20110506.110000-1.jar (ie this library has been generated on 2011/05/06 at 11:00:00) in your local repository, and if you run the Maven build again the same day, Maven will not check the repositories for a newer version.

Maven provides you a way to can change this update policy in your repository definition:

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

where XXX can be:

  • always : Maven will check for a newer version on every build;
  • daily , the default value;
  • interval:XXX : an interval in minutes (XXX)
  • never : Maven will never try to retrieve another version. It will do that only if it doesn't exist locally. With the configuration, SNAPSHOT version will be handled as the stable libraries.
  • (model of the settings.xml can be found here)


    The "SNAPSHOT" term means that the build is a snapshot of your code at a given time.

    It usually means that the version is a version still under heavy development.

    When it comes time to release your code, you will want to change the version listed in the pom. So instead of having a "SNAPSHOT" you would have something like "1.0".

    For some help with versioning, check out the Semantic Versioning specification.

    链接地址: http://www.djcxy.com/p/44078.html

    上一篇: Xerces依赖和JRE

    下一篇: Maven快照究竟是什么,为什么我们需要它?