什么是Maven Snapshot,为什么我们需要它?

问题

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


#1 热门回答(728 赞)

Maven中的快照版本尚未发布。

这个想法是在a1.0发布之前的(或任何其他版本)完成,存在一个1.0-SNAPSHOT。那个版本可能会成为“1.0”。它基本上是“正在开发的”1.0“。这可能是一个真正的“1.0”版本,或者相当远(例如,在“0.9”版本之后)。

“真实”版本和快照版本之间的区别在于快照可能会获得更新。这意味着今天下载“1.0-SNAPSHOT”可能会提供与昨天或明天下载不同的文件。

通常,快照依赖性应该在开发过程中仅存在**,并且没有发布的版本(即没有非快照)应该依赖于快照版本。


#2 热门回答(659 赞)

其他三个答案为你提供了-SNAPSHOT版本的良好视野。我只想添加一些关于Maven在找到SNAPSHOT依赖关系时的行为的信息。

构建应用程序时,Maven将在本地存储库中搜索依赖项。如果在那里找不到稳定版本,它将搜索远程存储库(在settings.xmlpom.xml中定义)以检索此依赖项。然后,它会将其复制到本地存储库,以使其可用于下一个版本。

例如,foo-1.0.jar库被认为是astableversion,如果Maven在本地存储库中找到它,它将使用这个库进行当前构建。

现在,如果你需要一个foo-1.0-SNAPSHOT.jar库,Maven会知道这个版本不稳定并且可能会有变化。这就是为什么Maven会尝试在远程存储库中找到更新版本的原因,即使在本地存储库中找到了该库的一个版本。但是,此检查每天只进行一次。这意味着如果你的本地存储库中有一个foo-1.0-20110506.110000-1.jar(即这个库已经在2011/05/0611:00:00生成),并且你运行了Maven构建同一天,Maven will没有检查新版本的存储库。

Maven为你提供了一种可以在存储库定义中更改此更新策略的方法:

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

其中XXX可以是:

  • 总是:Maven将检查每个版本的更新版本;
  • 每日,默认值;
  • interval:XXX:以分钟为单位的间隔(XXX)
  • 从不:Maven永远不会尝试检索另一个版本。只有当它不存在于本地时才会这样做。通过配置,SNAPSHOT版本将作为稳定库处理。

(settings.xml的模型可以找到here)


#3 热门回答(50 赞)

“SNAPSHOT”术语表示构建是给定时间代码的快照。

它通常意味着该版本仍处于重大开发阶段。

当需要发布代码时,你需要更改pom中列出的版本。所以不要使用“SNAPSHOT”而是“1.0”。

有关版本控制的一些帮助,请查看Semantic Versioning specification