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

时间:2011-05-05 16:50:50

标签: java maven dependency-management

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

15 个答案:

答案 0 :(得分:871)

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

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

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

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

答案 1 :(得分:723)

其他三个答案为您提供了-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将检查每个版本的新版本;
  • 每日,默认值;
  • 间隔:XXX :以分钟为单位的间隔(XXX)
  • 从不:Maven永远不会尝试检索其他版本。只有当它不存在于本地时才会这样做。通过配置,SNAPSHOT版本将作为稳定库处理。

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

答案 2 :(得分:60)

“SNAPSHOT”一词意味着构建是给定时间代码的快照。

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

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

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

答案 3 :(得分:23)

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

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

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

答案 4 :(得分:15)

Maven版本可以包含字符串文字“SNAPSHOT”,表示项目当前正在积极开发中。

例如,如果您的项目的版本为“1.0-SNAPSHOT”,并且您将此项目的工件部署到Maven存储库, 如果你愿意,Maven会把这个版本扩展到“1.0-20080207-230803-1” 在UTC时间2008年2月7日晚上11:08部署发布。换句话说,当你 部署快照,您不会发布软件组件;你是 在特定时间发布组件的快照。

因此,主要的快照版本用于正在开发的项目。 如果您的项目依赖于正在进行开发的软件组件, 你可以依赖快照发布,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

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

答案 6 :(得分:4)

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

  1. 快照构建:SNAPSHOT是指示当前部署副本不像常规版本的特殊版本,maven会检查远程存储库中每个构建的版本 所以快照构建只不过是开发构建。

  2. 发布版本:发布意味着在构建版本中删除SNAPSHOT,这些是常规版本。

答案 7 :(得分:4)

我想谈一谈术语。其他答案很好地解释了Maven上下文中的“快照”版本。但是,是否将非快照版本称为“发行”版本呢?

“发行”版本的语义版本控制思想之间存在一些张力,该版本似乎是没有限定符(例如-SNAPSHOT,但也没有限定符(例如{{ 1}};和Maven的“发行”版本的想法,其中似乎只包括缺少-beta.4

换句话说,“发布”是指“我们可以将其发布到Maven Central”还是“该软件已最终发布给公众”,这在语义上是模棱两可的。如果我们向公众发布-SNAPSHOT,我们可以认为它是“发布”版本,但它不是“最终发布”。 Semantic versioning清楚地指出,类似-beta.4的东西是“预发行”版本,因此即使没有-beta.4也被称为“发行”版本是没有意义的。实际上,根据定义,即使-SNAPSHOT也是候选版本,而不是实际版本,即使我们可能允许公众访问进行测试。

尽管如此,我认为Maven似乎更合适的是只调用一个完全没有限定符的“发布”版本,甚至没有-rc.5。对于Maven非快照版本,更好的名称可能是“稳定”版本(受another answer启发)。这样我们就可以:

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

答案 8 :(得分:2)

快照依赖 快照依赖项是正在开发的依赖项(JAR 文件)。您可以依赖项目的快照版本,而不是不断更新版本号以获取最新版本。对于每个构建,快照版本始终下载到本地存储库中,即使匹配的快照版本已位于本地存储库中。始终下载快照依赖项可确保您在每次构建时始终在本地存储库中拥有最新版本。

你的 pom 包含很多 -SNAPSHOT 依赖项,而那些 -SNAPSHOT 依赖项是一个移动目标 enter image description here

enter image description here

https://dzone.com/articles/maven-release-plugin-in-the-enterprise https://javarevisited.blogspot.com/2019/03/top-5-course-to-learn-apache-maven-for.html https://www.mojohaus.org/versions-maven-plugin/examples/lock-snapshots.html http://tutorials.jenkov.com/maven/maven-tutorial.html

答案 9 :(得分:1)

快照是一个特殊版本,它指示正在处理的项目的当前开发副本。对于每个构建,maven总是签出项目的快照。

  

每当maven找到该项目的新快照时,它都会下载并   替换本地存储库中项目的旧.jar文件。

快照版本始终会在项目上进行一些更新/更改。此外,快照应仅在开发阶段存在,并且不会具有发行版。这意味着该项目的构建将随时更改,并且仍在开发过程中。

构建应用程序时,Maven将在本地存储库中搜索依赖项。如果在那里找不到稳定的版本,它将搜索远程存储库(在pom.xml中定义)以检索此依赖项。然后,它将把它复制到本地存储库中,以供以后的版本使用。

答案 10 :(得分:0)

了解SDLC的上下文将有助于了解快照和发行版之间的区别。在开发过程中,开发人员都将其功能贡献给基准分支。在某个时候,线索认为已经积累了足够的功能,那么他将从基准分支中删除发布分支。在此时间点之前的所有构建都是快照。到此为止的构建都是发行版。需要注意的是,如果在发布测试期间发现任何缺陷,则发布版本在投入生产之前也可能会发生变化。

答案 11 :(得分:0)

简单地表示快照是不稳定的版本。

版本包含1.0.0之类的快照时-SNAPSHOT表示该版本不是稳定版本,请寻找远程存储库来解决依赖项

答案 12 :(得分:0)

快照仅表示根据您的配置,Maven将检查特殊依赖项上的最新更改。快照不稳定,因为它正在开发中,但是如果在特殊项目上需要进行最新更改,则必须将依赖项版本配置为快照版本。在具有多个产品的大型组织中会发生这种情况,这些产品之间的联系非常紧密。

答案 13 :(得分:0)

顾名思义,快照是指项目的状态及其在那时的依赖关系。只要maven找到项目的较新版本SNAPSHOT,它就会下载并替换本地存储库中项目的较旧.jar文件。

快照版本用于活动开发中的项目。如果您的项目依赖于正在开发中的软件组件,则可以依赖快照发行版,并且在运行构建时,Maven会定期尝试从存储库下载最新的快照。

答案 14 :(得分:-1)

Maven SNAPSHOT是由Maven构建创建的工件,并假装在软件开发周期中帮助开发人员。 SNAPSHOT是一种伪装(或项目构建结果),不会假装在任何地方使用,它只是一个临时的.jar,ear,...,用于测试构建过程或测试尚未准备就绪的新需求到生产环境。 对SNAPSHOT工件的质量感到满意之后,您可以创建一个RELEASE工件,该工件可被其他项目使用或自行部署。

在您的项目中,可以使用Maven的pom.xml文件中的version元素定义SNAPSHOT:

<groupId>example.project.maven</groupId>
<artifactId>MavenEclipseExample</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<description>Maven pom example</description>

如果您想更好地了解Maven,也可以阅读以下文章:

https://connected2know.com/programming/menu-maven-articles/