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

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

448828 次浏览

“发布”是一个版本的最终版本,它不会改变。

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

对于基于相同代码的不同构建,您有不同的工件。例如,您可能有一个带有调试,一个没有。一个用于Java5.0,一个用于Java6。通常,拥有一个可以完成您需要的一切的构建会更简单。;)

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

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

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

有关版本控制的一些帮助,请查看语义版本控制规范

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

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

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

通常,快照依赖关系应该只有存在于开发过程中,并且没有正式版本(即没有非快照)应该依赖于快照版本。

另外三个答案为您提供了一个关于-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的模型可以找到这里)

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

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

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

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

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

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

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

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

在此处输入图片描述

我想说明一下术语。其他答案很好地解释了在Maven的上下文中什么是“快照”版本。但是,这是否意味着非快照版本应该被称为“发布”版本?

“发布”版本的语义版本控制思想之间存在一些紧张关系,它似乎是任何没有限定符(如-SNAPSHOT)但也没有限定符(如-beta.4)的版本;和Maven的“发布”版本的想法,它似乎只包括没有-SNAPSHOT

换句话说,“发布”的意思是“我们可以将其发布到Maven Central”还是“该软件正在向公众发布”,这是一个语义上的歧义。如果我们向公众发布,我们可以认为-beta.4是一个“发布”版本,但它不是一个“最终版本”。语义版本控制清楚地表明,像-beta.4这样的东西是一个“预发布”版本,所以即使没有-SNAPSHOT,它也没有被称为“发布”版本的意义。事实上,根据定义,即使我们可能允许公众进行测试,即使-rc.5也是一个版本候选人,而不是真正的版本。

因此,尽管有Maven,但在我看来,只将一个根本没有任何限定符的版本称为“发布”版本似乎更合适,甚至连-beta.4都没有。也许Maven非快照版本的更好名称是“稳定”版本(受另一个答案的启发)。因此,我们会有:

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

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

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

当版本包含快照时,如1.0.0-SNAPSHOT意味着它不是稳定版本,并寻找远程存储库来解决依赖关系

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

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

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

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

在您的项目中,您可以使用Mavenpom.xml文件中的版本元素定义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/

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

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

总是。每日(默认),间隔,永远不会

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