ChatGPT解决这个技术问题 Extra ChatGPT

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

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


C
ChrisDevo

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”,也不必在发布之前。其他一切都是正确的——它是对移动目标的不稳定引用,不能依赖它来产生可重复的构建。
谢谢@ScottCarey。 “通常先于”可能确实更准确,因为甚至不能保证“移动目标”最终会存在。
为什么他们不能直接称它为“1.0-DEVELOPMENT”,或者像“1.0-INPROGRESS”,为什么人们必须使用非显而易见的术语
@Sнаđошƒаӽ:我不太确定你想用这个咆哮来完成什么。 SNAPSHOT 来自于它是持续开发过程中项目状态的“快照”。可能有一个更好的名字,但它并非完全没有意义。
J
Jeevan

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

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

例如,foo-1.0.jar 库被视为 stable 版本,如果 Maven 在本地存储库中找到它,它会将这个库用于当前构建。

现在,如果您需要 foo-1.0-SNAPSHOT.jar 库,Maven 将知道此版本不稳定并且可能会发生变化。这就是为什么 Maven 会尝试在远程存储库中找到更新版本的原因,即使在本地存储库中找到了此库的版本。但是,此检查每天仅进行一次。这意味着如果您的本地存储库中有一个 foo-1.0-20110506.110000-1.jar(即这个库是在 2011 年 5 月 6 日 11:00:00 生成的),并且如果您在同一天再次运行 Maven 构建,Maven 将 < strong>不 检查存储库是否有较新的版本。

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

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

其中 XXX 可以是:

always:Maven 将在每次构建时检查更新的版本;

每日,默认值;

间隔:XXX:以分钟为单位的间隔(XXX)

never: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。你有没有发现别的东西?
s
spaniard81

“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 团队所谓的“快照”的另一个名称。人们当然可以很容易地争论“为什么他们被称为检查站???” :)
D
Dev2017

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

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

对于基于相同代码的不同构建,您有不同的工件。例如,您可能有一个带有调试功能,一个没有。一个用于 Java 5.0,一个用于 Java 6。通常,拥有一个可以满足您所需的一切的构建更简单。 ;)


J
Joby Wilson Mathews

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

https://i.stack.imgur.com/BAYDk.png


G
Garret Wilson

我想谈谈术语。其他答案很好地解释了 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 内容可以根据您的需要而改变。所以有人可以从中删除一个类,将其推送到 repo,现在你的代码会中断,即使它依赖于相同的版本 1.0-SNAPSHOT。每个其他版本(所有没有后缀 -SNAPSHOT 的版本)都应该是稳定的,因为一旦您将其发布到存储库,它包含的就是它所包含的内容,您将不再更改它,如果您更改任何内容,它将下一个新版本。
V
Venky Vungarala

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

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


K
Kati Holasz

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

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


t
tagus

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/


当快照是开发周期的合法部分时,“假装”是一个非常苛刻的词(请参阅 Spring Framework 所做的任何事情,从它的夜间构建到它的发布候选策略)
@BlakeNeal 用户 tagus 可能不是以英语为母语的人(可能他是以西班牙语为母语的人),当他实际上想说“旨在帮助开发人员”时,他错误地使用了“假装”这个词:可能的含义之一西班牙语中的“伪装者”一词是“瞄准”:translate.google.com/…
s
shanika prasangika

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

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


M
Mahdi Soltani

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


C
CCNA

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


S
Sourabh Bhavsar

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

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


U
Umesh Bhutada

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

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

总是、每天(默认)、间隔、从不、

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