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

问题描述 投票:726回答:9

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

java maven dependency-management
9个回答
856
投票

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

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

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

通常,快照依赖项应该仅在开发期间存在,并且没有发布的版本(即没有非快照)应该依赖于快照版本。


712
投票

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

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

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

现在,如果你需要一个foo-1.0-SNAPSHOT.jar库,Maven会知道这个版本不稳定并且可能会有变化。这就是Maven将尝试在远程存储库中找到更新版本的原因,即使在本地存储库中找到了此库的一个版本。但是,此检查每天只进行一次。这意味着,如果您在本地存储库中有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)
  • 永远不会:Maven永远不会尝试检索另一个版本。只有当它不存在于本地时才会这样做。通过配置,SNAPSHOT版本将作为稳定库处理。

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


60
投票

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

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

当代码准备好并且是时候释放它时,您将需要更改POM中列出的版本。然后,您将使用像“1.0”这样的标签而不是“SNAPSHOT”。

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


23
投票

“发布”是版本的最终版本,不会发生变化。

“快照”是一个构建,可以由具有相同名称的另一个构建替换。这意味着构建可能随时发生变化,并且仍在积极开发中。

基于相同的代码,您有不同构建的不同工件。例如。你可能有一个调试,一个没有。一个用于Java 5.0,一个用于Java 6.通常,只需一个构建即可完成所需的一切。 ;)


13
投票

Maven版本可以包含字符串文字“SNAPSHOT”,表示项目当前处于活动开发状态。

例如,如果您的项目的版本为“1.0-SNAPSHOT”,并且您将此项目的工件部署到Maven存储库,那么如果您要在11版本部署版本,Maven会将此版本扩展为“1.0-20080207-230803-1”。 :UTC时间2008年2月7日晚上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

maven发布过程的一个例子

enter image description here


4
投票

这就是存储库的快照的样子,并且在这种情况下未启用,这意味着此处引用的存储库是稳定的,不需要更新。

<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将查找此存储库的更新。您还可以使用标记指定更新的间隔。


4
投票

我想谈谈术语。其他答案很好地解释了Maven环境中“快照”版本的含义。但是,是否应该将非快照版本称为“发布”版本?

“发布”版本的语义版本化概念之间存在一些紧张关系,这似乎是任何没有-SNAPSHOT等限定符的版本,但也没有像-beta.4这样的限定符;和Maven关于“发布”版本的想法,这似乎只包括没有-SNAPSHOT

换句话说,“释放”是否意味着“我们可以将其发布到Maven Central”或“软件是否向公众发布最终版本”存在语义歧义。如果我们将它发布给公众,我们可以认为-beta.4是一个“发布”版本,但它不是“最终版本”。 Semantic versioning清楚地说像-beta.4这样的东西是一个“预发布”版本,所以即使没有-SNAPSHOT,它被称为“发布”版本也没有意义。实际上,根据定义,即使我们可能允许公共访问进行测试,即使-rc.5是候选版本,也不是实际版本。

所以Maven尽管如此,在我看来,似乎更合适的只是称一个没有任何限定符的“发布”版本,甚至-beta.4。对于Maven非快照版本来说,更好的名称可能是“稳定”版本(受another answer启发)。因此我们会:

  • 1.2.3-beta.4-SNAPSHOT:预发布版本的快照版本。
  • 1.2.3-SNAPSHOT:发布版本的快照版本。
  • 1.2.3-beta.4:预发布版本的稳定版本。
  • 1.2.3:发布版本(显然是一个稳定的非快照版本)。

4
投票

通常在maven中我们有两种类型的构建1)快照构建2)发布构建

  1. 快照构建:SNAPSHOT是指示当前部署副本不像常规版本的特殊版本,maven会检查远程存储库中每个构建的版本,因此快照构建只是开发构建。
  2. 发布版本:发布意味着在构建版本中删除SNAPSHOT,这些是常规版本。

0
投票

了解SDLC的上下文将有助于理解快照和发布之间的区别。在开发过程中,开发人员都将其功能贡献给基线分支。在某些时候,领导认为已经累积了足够的特征,然后他将从基线分支中删除一个发布分支。此时间点之前的任何构建都是快照。到目前为止构建的帖子是发布。需要注意的是,如果在发布测试期间出现任何缺陷点,发布版本在生产之前也会发生变化。

© www.soinside.com 2019 - 2024. All rights reserved.