【问题标题】:What exactly is a Maven Snapshot and why do we need it?Maven 快照到底是什么,我们为什么需要它?
【发布时间】:2023-01-31 11:13:09
【问题描述】:

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

【问题讨论】:

    标签: java maven dependency-management


    【解决方案1】:

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

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

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

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

    【讨论】:

    • @amphibient:不,快照是不是必然更稳定:它只是最新版本。快照先于实际发布,它不会在它之后出现。实际上,版本号通常不指代分支。
    • @avandeursen 快照不一定具有您声称的语义。您可以拥有“master-SNAPSHOT”,然后发布 1.0 版本。它不一定是“FutureVersion-SNAPSHOT”,也不一定先于发布。不过其他一切都是正确的——它是对移动目标的不稳定引用,不能依赖它来生成可重复的构建。
    • 为什么他们不能直接称它为“1.0-DEVELOPMENT”,或者像“1.0-INPROGRESS”,为什么人们必须使用非显而易见的术语
    • 是不是只有我一个人认为 Java 堆栈中的所有东西都有奇怪的名字,就好像它们是由怪人开发的一样?快照这个词甚至与它所使用的概念没有任何关系。 Java 世界中的几乎所有事物都有完全垃圾的无意义名称。完全同意这个@uh_big_mike_boi
    • @Sнаđошƒаӽ:我不太确定你想用这个咆哮来完成什么。 SNAPSHOT 源于这样一个事实,即它是持续开发过程中项目状态的“快照”。可能有一个更好的名字,但它并非完全没有意义。
    【解决方案2】:

    其他三个答案让您清楚地了解什么是 -SNAPSHOT 版本。我只是想添加一些有关 Maven 发现 SNAPSHOT 依赖项时的行为的信息。

    当您构建应用程序时,Maven 将在当地的存储库。如果在那里找不到稳定版本,它将搜索远程存储库(在settings.xml 或pom.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)找到

    【讨论】:

    • 似乎可以使用命令行开关强制 maven 重新下载所有SNAPSHOT 版本:mvn clean package -U 按照maven tutorial
    • 小心 -U 标志。由于MNG-4142,它可能无法达到您的预期。
    • 另外值得一提的是,好的做法要求您在创建发布版本时不使用快照依赖项,而且如果存在快照依赖项,Maven 发布插件确实会失败。
    • 我运行mvn install 将 1.0-SNAPSHOT 版本的 jar 安装到我的本地存储库中。第二天,我对项目进行了更改,但没有更改版本——然后在运行 mvn install 时,它似乎没有在我的本地仓库中更改它。这是预期的行为吗?我不能重新使用一个版本并在更改后用 mvn install 覆盖它吗?
    • @mmcrae AFAIK 它应该更新。就是这样安装目标是,更新本地 SNAPSHOT jar。你有没有发现别的东西?
    【解决方案3】:

    “SNAPSHOT”一词表示构建是您的代码在给定时间的快照。

    这通常意味着该版本仍在大量开发中。

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

    如需版本控制方面的帮助,请查看Semantic Versioning specification。

    【讨论】:

    • 按照语义版本控制,-SNAPSHOT 版本将是预发布版本:“预发布版本表示该版本不稳定,可能无法满足其关联的正常版本所指示的预期兼容性要求。示例:1.0.0-alpha、1.0.0-alpha.1、1.0.0-0.3.7、1.0.0-x.7.z.92。“
    • 在我看来,“SNAPSHOT”不是“特定时间代码的快照”,而是“可用代码的最新版本”。如果这是 HTTP,它会是一个标志,上面写着:“不要费心做 HEAD,无论如何都要获取服务器上的任何内容。”实际上,它几乎是相反的“给定时间的代码”。
    • 什么是“重度”开发?
    • @Joker“沉重”是指很多事情都在发生变化(新功能、重构等)
    • 我最近阅读了一篇关于 git 工作流程的文章 (sandofsky.com/workflow/git-workflow),作者使用了术语“检查点提交”。好吧,这个“检查点”只是 Maven 团队所谓的“快照”的别称。人们当然可以很容易地争论“为什么他们被称为检查站???” :)
    【解决方案4】:

    “发布”是不会更改的版本的最终构建。

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

    对于基于相同代码的不同构建,您有不同的工件。例如。你可能有一个调试和一个没有。一个用于 Java 5.0,一个用于 Java 6。一般来说,拥有一个可以满足您需要的一切的构建更简单。 ;)

    【讨论】:

      【解决方案5】:

      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发布流程示例

      【讨论】:

        【解决方案6】:

        我想强调一下术语。其他答案很好地解释了 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:发布版本(显然是稳定的非快照版本)。

        【讨论】:

        • 您是否有任何关于 Maven 如何处理构建元数据或预发布命名约定的信息?我的意思是,我们都知道 alfa 先于 beta,但是 maven 知道吗?即使将 1.2.3-beta.4 作为稳定版本,它是否至少知道 1.2.3 在它之后?
        • SNAPSHOT 意味着 Jar 内容可以根据您的依赖而改变。因此有人可以从中删除一个类,将其推送到存储库,现在您的代码将中断,即使它依赖于相同的版本 1.0-SNAPSHOT。每个其他版本(所有没有后缀 -SNAPSHOT 的版本)都应该是稳定的,因为一旦你将它发布到 repo,它包含的就是它所包含的,你不会再改变它,如果你改变任何东西它会在新版本下。
        【解决方案7】:

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

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

        2. 发布版本:发布意味着删除构建版本的快照,这些是常规构建版本。

        【讨论】:

          【解决方案8】:

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

          在您的项目中,您可以使用 Maven 的 pom.xml 文件中的版本元素定义快照:

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

          【讨论】:

          • 当快照是开发周期的合法部分时,“假装”是一个非常苛刻的词(看看 Spring Framework 所做的一切,从它的夜间构建到它的发布候选策略)
          • @BlakeNeal 用户 tagus 可能不是以英语为母语的人(可能他是以西班牙语为母语的人)并且当他实际上想说“旨在帮助开发人员”时他错误地使用了“假装”一词:可能的含义之一西班牙语中“伪装者”一词的意思是“瞄准”:translate.google.com/…
          【解决方案9】:

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

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

          【讨论】:

            【解决方案10】:

            简单的快照意味着它是不稳定的版本。

            当版本包含 1.0.0 之类的快照时 -SNAPSHOT 表示它不是稳定版本并寻找远程存储库来解决依赖关系

            【讨论】:

              【解决方案11】:

              快照只是意味着根据您的配置,Maven 将检查特殊依赖项的最新更改。快照是不稳定的,因为它正在开发中,但如果在一个特殊的项目上需要有最新的更改,你必须将你的依赖版本配置为快照版本。这种情况发生在拥有多种产品的大型组织中,这些产品彼此之间的关系非常密切。

              【讨论】:

                【解决方案12】:

                了解 SDLC 的上下文将有助于理解快照和发布之间的区别。在开发过程中,开发人员都将他们的功能贡献给基线分支。在某个时候,领导认为已经积累了足够的特性,然后他将从基线分支中切出一个发布分支。在此时间点之前的任何构建都是快照。到此为止的构建是发布。请注意,如果在发布测试期间发现任何缺陷,发布版本也可能在投入生产之前更改。

                【讨论】:

                  【解决方案13】:

                  顾名思义,快照是指项目及其依赖项在该时刻的状态。每当 maven 发现项目的更新 SNAPSHOT 时,它就会下载并替换本地存储库中项目的旧 .jar 文件。

                  快照版本用于正在积极开发的项目。如果你的项目依赖于一个正在积极开发的软件组件,你可以依赖一个快照版本,当你运行构建时,Maven 会定期尝试从存储库下载最新的快照。

                  【讨论】:

                    【解决方案14】:

                    在开发阶段,Maven 快照每天都会寻找更新的更高版本(如果在 nexus 存储库中可用),然后在本地下载它以用于下一次构建。

                    您可以在存储库定义中设置的四个选项

                    总是, 每天(默认), 间隔, 绝不,

                    注意:在生产版本中,我们不应该依赖于快照版本。

                    【讨论】:

                      猜你喜欢
                      • 2011-08-19
                      • 1970-01-01
                      • 2011-01-15
                      • 2017-02-24
                      • 2017-08-24
                      • 2023-03-04
                      • 1970-01-01
                      相关资源
                      最近更新 更多